Skip to content

Conversation

@ananzh
Copy link
Member

@ananzh ananzh commented Nov 26, 2025

Description

This PR refactors the chat plugin architecture by extracting shared infrastructure into a core chat service. This establishes a clean separation of concerns where the core manages state infrastructure and plugins provide business logic through delegation.

Key Changes

  • Architecture Refactoring

    • Extracted Core Chat Service: Created src/core/public/chat/ with centralized state management for thread IDs, window state, and service lifecycle
    • Plugin Delegation Pattern: Converted chat plugin service from duplicate implementations to pure delegation to core service
    • Interface Standardization: Unified ChatWindowState and other interfaces in core, removing duplicate type definitions
  • Infrastructure vs Business Logic Separation

    • Core Service Responsibilities:
      • Thread ID management with BehaviorSubject
      • Window state management (open/closed, sidecar/fullscreen, padding)
      • Service availability and lifecycle
      • Event subscription handling
    • Plugin Service Responsibilities:
      • AI agent communication (AgUiAgent)
      • Message sending and tool result processing
      • Context management and workspace-aware data source handling
      • Business logic for chat interactions

Issues Resolved

NA

Screenshot

  • Test chat after refactor
refactor-chat.mov
  • Test investigation after refactor
refactor-investigation.mov

Testing the changes

Changelog

  • refactor: [Chat] Refactor chat architecture: Extract shared infrastructure into a core chat service

Check List

  • All tests pass
    • yarn test:jest
    • yarn test:jest_integration
  • New functionality includes testing.
  • New functionality has been documented.
  • Update CHANGELOG.md
  • Commits are signed per the DCO using --signoff

Summary by CodeRabbit

  • New Features

    • Core chat service added (thread & window management, messaging) with workspace-aware data source selection and ML agent routing.
    • Chat surfaced across platform lifecycle and plugin contexts; Ask AI action now uses core chat availability and improved header/button behavior.
  • Refactor

    • Shared chat infrastructure extracted into core for consistent integration.
  • Tests

    • Expanded unit/integration tests for chat lifecycle, capabilities, actions, and routing.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link

coderabbitai bot commented Nov 26, 2025

Walkthrough

Centralizes chat infrastructure into a new core ChatService with observable thread/window state and public types; refactors the chat plugin to delegate to core services; introduces ML agent routing abstractions with AG‑UI fallback; removes several chart visualization error-handling modules and updates numerous tests and integrations.

Changes

Cohort / File(s) Change Summary
Core chat API & impl
src/core/public/chat/types.ts, src/core/public/chat/chat_service.ts, src/core/public/chat/chat_service.mock.ts, src/core/public/chat/index.ts, src/core/public/chat/chat_service.test.ts
Added public chat types and service contracts; implemented ChatService (setup/start/stop) with BehaviorSubject observables for threadId/windowState; added mocks and unit tests for setup/start behavior, delegation, observables, and lifecycle.
Core system integration & mocks
src/core/public/core_system.ts, src/core/public/index.ts, src/core/public/mocks.ts, src/core/public/plugins/plugin_context.ts, src/core/public/plugins/plugins_service.test.ts
Wired ChatService into CoreSystem lifecycle and public CoreSetup/CoreStart contracts; propagated chat into plugin contexts; extended core mocks to include chat.
Chat plugin — refactor & UI
src/plugins/chat/public/plugin.ts, src/plugins/chat/public/plugin.test.ts, src/plugins/chat/public/services/chat_service.ts, src/plugins/chat/public/services/chat_service.test.ts, src/plugins/chat/public/components/chat_header_button.tsx, src/plugins/chat/public/components/chat_header_button.test.tsx, src/plugins/chat/public/components/chat_window.tsx, src/plugins/chat/public/components/chat_window.tsx
Refactored plugin to use core.chat, always initialize ChatService with core dependencies, use isChatEnabled guard, delegate thread/window state and messaging to core ChatService, add workspace-aware dataSource resolution, adjust UI components to check core.chat.isAvailable and adapt handlers; update tests.
Chat types & capability helpers
src/plugins/chat/common/types.ts, src/plugins/chat/common/chat_capabilities.ts, src/plugins/chat/common/chat_capabilities.test.ts
Re-exported message types from core public API; added isChatEnabled and hasInvestigationCapabilities helpers with tests.
Actions & hooks
src/plugins/chat/public/actions/graph_timeseries_data_action.tsx, src/plugins/chat/public/actions/graph_timeseries_data_action.test.tsx
Added optional enabled parameter (default true) to useGraphTimeseriesDataAction and tests for enabled flag behavior.
Event handling & tool results
src/plugins/chat/public/services/chat_event_handler.ts, src/plugins/chat/public/services/chat_event_handler.test.ts
Deferred insertion of tool result messages into the timeline until assistant-provided toolMessage is received; updated tests to mock tool result payloads.
Removed: chat context manager & tests
src/plugins/chat/public/services/chat_context_manager.ts, src/plugins/chat/public/services/chat_context_manager.test.ts
Removed ChatContextManager and its test suite (static/dynamic context orchestration and related observables).
Removed: chart visualization error subsystem
src/plugins/chat/public/components/graph_visualization/error_boundary.tsx, src/plugins/chat/public/components/graph_visualization/error_display.tsx, src/plugins/chat/public/components/graph_visualization/error_handler.ts
Deleted full chart error-handling stack: error boundary, error display components, enhanced error types, logger, and validation utilities.
Graph validation header
src/plugins/chat/public/components/graph_visualization/validation.ts
Removed license header comment only.
AG‑UI agent changes
src/plugins/chat/public/services/ag_ui_agent.ts
runAgent now accepts optional dataSourceId and appends it to proxy URL when provided.
Plugin manifests & server config
src/plugins/chat/opensearch_dashboards.json, src/plugins/chat/server/index.ts
Added requiredBundles: ["dataSourceManagement"] and exposed config.enabled to browser.
ML agent routing infra
src/plugins/chat/server/routes/ml_routes/ml_agent_router.ts, src/plugins/chat/server/routes/ml_routes/router_registry.ts, src/plugins/chat/server/routes/ml_routes/generic_ml_router.ts
Added MLAgentRouter interface, factory/registry and GenericMLRouter implementation to forward to ML Commons agents with streaming handling, error mapping, and capability-based registration.
Removed ML Commons forwarder & tests
src/plugins/chat/server/routes/ml_routes/ml_commons_agent.ts, src/plugins/chat/server/routes/ml_routes/ml_commons_agent.test.ts
Removed prior ML Commons agent forwarder and its tests; replaced by GenericMLRouter abstraction.
Server routes & tests
src/plugins/chat/server/routes/index.ts, src/plugins/chat/server/routes/index.test.ts
Centralized AG‑UI forwarding helper forwardToAgUI, added dataSourceId query handling, integrated ML router usage with AG‑UI fallback, and updated route signature and tests for ML routing scenarios.
Explore plugin updates
src/plugins/explore/opensearch_dashboards.json, src/plugins/explore/public/plugin.ts, src/plugins/explore/public/types.ts, src/plugins/explore/public/build_services.ts, src/plugins/explore/public/components/tabs/action_bar/action_bar.tsx
Removed chat from optionalPlugins; removed chat dependency from ExploreStartDependencies; made slotRegistry optional; unconditionally register Ask AI action using core.chat; added safe fallback for optional slotRegistry.
Explore Ask AI action & tests
src/plugins/explore/public/actions/ask_ai_action.ts, src/plugins/explore/public/actions/ask_ai_action.test.ts, src/plugins/explore/public/components/ask_ai_action_item/ask_ai_action_item.tsx, src/plugins/explore/public/components/ask_ai_action_item/ask_ai_action_item.test.tsx
Migrated consumers to use core ChatServiceStart (chatService.isAvailable), updated signatures and mocks, and simplified sendMessageWithWindow usage.
Misc changelog
changelogs/fragments/10983.yml
Added fragment noting chat architecture refactor into core ChatService.

Sequence Diagram

sequenceDiagram
    actor Plugin as Chat Plugin
    participant Core as CoreSystem
    participant ChatSvc as ChatService (core)
    participant Impl as Plugin Implementation
    participant MLRouter as MLAgentRouter / AG-UI

    Note over Core,ChatSvc: Setup & Start
    Plugin->>Core: setup(core)
    Core->>ChatSvc: instantiate ChatService
    Core->>ChatSvc: start()
    ChatSvc-->>Core: ChatServiceStart (public contract)

    Note over Plugin,Impl: Runtime messaging flow
    Plugin->>ChatSvc: sendMessage(content, messages)
    alt Implementation registered
        ChatSvc->>Impl: sendMessage(content, messages)
        Impl-->>ChatSvc: { observable, userMessage }
        ChatSvc-->>Plugin: resolve with userMessage and observable
    else No implementation
        ChatSvc-->>Plugin: reject "Chat plugin not enabled"
    end

    Note over ChatSvc,MLRouter: Server-side agent routing (when triggering agent)
    ChatSvc->>MLRouter: forward request (includes dataSourceId)
    alt ML router available
        MLRouter-->>ChatSvc: streaming or JSON response
    else Fallback
        ChatSvc->>MLRouter: forwardToAgUI proxy
        MLRouter-->>ChatSvc: streaming SSE response
    end

    Note over Core,ChatSvc: Window state
    Plugin->>ChatSvc: setWindowState({isWindowOpen:true})
    ChatSvc->>ChatSvc: update windowState$ -> emit
    ChatSvc->>Plugin: invoke onWindowOpen callbacks
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

  • Areas needing focused review:
    • src/core/public/chat/chat_service.ts — observable lifecycle, thread ID generation, error messaging when implementation missing.
    • src/plugins/chat/public/services/chat_service.ts — workspace-aware dataSourceId resolution and delegation to core chat.
    • src/plugins/chat/server/routes/ml_routes/* and src/plugins/chat/server/routes/index.ts — ML router factory/registry, GenericMLRouter streaming/error mapping and AG‑UI fallback.
    • Removals: ensure no remaining references to deleted chart error modules cause build/test failures.
    • Cross-plugin contract changes (explore <> core chat) — update all callers to new ChatServiceStart surface.

Poem

🐰 I hopped through threads and windows wide,
Core roots planted, plugins now glide,
Routers route, agents sing their tune,
Old error pages fade by moon,
A rabbit cheers — new chat blooms soon!

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 53.85% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately reflects the main change: chat architecture refactoring with extraction of shared infrastructure into a core service.
Description check ✅ Passed The PR description includes all key template sections: detailed description of changes, key objectives, changelog entry, and testing checklist. Description is comprehensive and directly addresses the purpose.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d08609d and b9ecc7e.

📒 Files selected for processing (1)
  • changelogs/fragments/10983.yml (1 hunks)
🧰 Additional context used
🪛 YAMLlint (1.37.1)
changelogs/fragments/10983.yml

[error] 2-2: syntax error: expected , but found ''

(syntax)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (67)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run plugin functional tests on Windows
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup7)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup1)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup4)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup2)
  • GitHub Check: Run functional tests on Linux (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup1)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Build min release artifacts on Linux x64
  • GitHub Check: Build min release artifacts on Windows x64
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Build min release artifacts on macOS ARM64
  • GitHub Check: Build min release artifacts on Linux ARM64
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run plugin functional tests on Linux
  • GitHub Check: Build min release artifacts on macOS x64
  • GitHub Check: Build and Verify on Windows (ciGroup3)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup10Fast)
  • GitHub Check: Build and Verify on Windows (ciGroup4)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run cypress tests (osd:ciGroup6)
  • GitHub Check: Run cypress tests (osd:ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup1)
  • GitHub Check: Run cypress tests (osd:ciGroup10Slow)
  • GitHub Check: Run cypress tests (osd:ciGroup9)
  • GitHub Check: Run cypress tests (osd:ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup7)
  • GitHub Check: Run cypress tests (osd:ciGroup4)
  • GitHub Check: Run cypress tests (osd:ciGroup3)
  • GitHub Check: Run cypress tests (osd:ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup1)
  • GitHub Check: Build and Verify on Windows (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup1)
  • GitHub Check: Build and Verify on Linux (ciGroup2)
  • GitHub Check: Lint and validate
  • GitHub Check: bundle-analyzer
  • GitHub Check: lighthouse

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Contributor

❌ Empty Changelog Section

The Changelog section in your PR description is empty. Please add a valid changelog entry or entries. If you did add a changelog entry, check to make sure that it was not accidentally included inside the comment block in the Changelog section.

@codecov
Copy link

codecov bot commented Nov 26, 2025

Codecov Report

❌ Patch coverage is 55.46559% with 110 lines in your changes missing coverage. Please review.
✅ Project coverage is 60.77%. Comparing base (a47de88) to head (b9ecc7e).
⚠️ Report is 5 commits behind head on main.

Files with missing lines Patch % Lines
src/plugins/chat/public/services/chat_service.ts 46.05% 27 Missing and 14 partials ⚠️
.../chat/server/routes/ml_routes/generic_ml_router.ts 5.55% 34 Missing ⚠️
src/core/public/chat/chat_service.ts 82.60% 7 Missing and 1 partial ⚠️
...gins/chat/public/components/chat_header_button.tsx 53.84% 2 Missing and 4 partials ⚠️
src/plugins/chat/public/plugin.ts 50.00% 3 Missing and 3 partials ⚠️
...ns/chat/server/routes/ml_routes/router_registry.ts 44.44% 4 Missing and 1 partial ⚠️
src/plugins/chat/server/routes/index.ts 82.60% 2 Missing and 2 partials ⚠️
...ns/chat/server/routes/ml_routes/ml_agent_router.ts 33.33% 2 Missing ⚠️
src/plugins/chat/public/components/chat_window.tsx 75.00% 1 Missing ⚠️
src/plugins/chat/public/services/ag_ui_agent.ts 50.00% 0 Missing and 1 partial ⚠️
... and 2 more
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #10983      +/-   ##
==========================================
- Coverage   60.79%   60.77%   -0.02%     
==========================================
  Files        4531     4537       +6     
  Lines      122262   122381     +119     
  Branches    20501    20535      +34     
==========================================
+ Hits        74325    74376      +51     
- Misses      42695    42748      +53     
- Partials     5242     5257      +15     
Flag Coverage Δ
Linux_1 26.55% <5.66%> (-0.01%) ⬇️
Linux_2 38.97% <84.90%> (+0.04%) ⬆️
Linux_3 39.44% <37.75%> (-0.07%) ⬇️
Linux_4 33.73% <11.86%> (-0.01%) ⬇️
Windows_1 26.56% <5.66%> (-0.01%) ⬇️
Windows_2 38.95% <84.90%> (+0.04%) ⬆️
Windows_3 39.44% <37.75%> (-0.08%) ⬇️
Windows_4 33.73% <11.86%> (-0.01%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@ananzh ananzh force-pushed the refactor-chat branch 2 times, most recently from 2ed2cbd to 79000d0 Compare November 27, 2025 06:56
],
"requiredBundles": ["opensearchDashboardsReact", "opensearchDashboardsUtils", "dashboard"],
"optionalPlugins": ["home", "share", "chat", "contextProvider", "datasetManagement"],
"requiredBundles": ["opensearchDashboardsReact", "opensearchDashboardsUtils", "dashboard", "dataSource"],
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems dataSource isn't being used in the explore plugin. Can we remove this dependency?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

removed

@ananzh ananzh force-pushed the refactor-chat branch 2 times, most recently from c9d0b03 to 7c8fc22 Compare December 1, 2025 07:47
@ananzh ananzh changed the title Refactor chat to chat service and chat plugin [Chat] Refactor chat architecture: Extract core service and eliminate duplicate implementations Dec 1, 2025
@github-actions
Copy link
Contributor

github-actions bot commented Dec 1, 2025

❌ Empty Changelog Section

The Changelog section in your PR description is empty. Please add a valid changelog entry or entries. If you did add a changelog entry, check to make sure that it was not accidentally included inside the comment block in the Changelog section.

@ananzh ananzh changed the title [Chat] Refactor chat architecture: Extract core service and eliminate duplicate implementations [Chat] Refactor chat architecture: Extract shared infrastructure into a core chat service Dec 1, 2025
@github-actions
Copy link
Contributor

github-actions bot commented Dec 1, 2025

❌ Empty Changelog Section

The Changelog section in your PR description is empty. Please add a valid changelog entry or entries. If you did add a changelog entry, check to make sure that it was not accidentally included inside the comment block in the Changelog section.

1 similar comment
@github-actions
Copy link
Contributor

github-actions bot commented Dec 1, 2025

❌ Empty Changelog Section

The Changelog section in your PR description is empty. Please add a valid changelog entry or entries. If you did add a changelog entry, check to make sure that it was not accidentally included inside the comment block in the Changelog section.

@ananzh ananzh requested a review from paulstn as a code owner December 1, 2025 17:26
opensearch-changeset-bot bot added a commit to ananzh/OpenSearch-Dashboards that referenced this pull request Dec 1, 2025
opensearch-changeset-bot bot added a commit to ananzh/OpenSearch-Dashboards that referenced this pull request Dec 1, 2025
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🧹 Nitpick comments (20)
src/plugins/chat/public/plugin.test.ts (1)

38-47: Tests align with core-driven chat enablement; consider tightening core mocks

The updated tests correctly:

  • Model investigation capabilities via application.capabilities.investigation.agenticFeaturesEnabled.
  • Assert that ChatPlugin.start always constructs ChatService with (core.uiSettings, core.chat) and registers header nav controls across config variants, pushing enablement semantics into the core chat service.

One optional improvement: to catch future usages of uiSettings/chat in ChatPlugin.start earlier in tests, you could seed minimal stubs on mockCoreStart instead of leaving them undefined, e.g.:

-    mockCoreStart = {
-      application: {
+    mockCoreStart = {
+      uiSettings: {} as any,
+      chat: {} as any,
+      application: {
         currentAppId$: mockCurrentAppId$,
         capabilities: {
           investigation: {
             agenticFeaturesEnabled: true,
           },
         },
       },
       chrome: {

This keeps expectations the same while making tests more sensitive to accidental direct use of those contracts.

Also applies to: 90-96, 118-122, 126-132, 180-189

src/plugins/chat/public/components/chat_window.tsx (1)

66-71: Ref-based timeline access and imperative API look solid; debug log may be unnecessary

Using timelineRef with a stable ChatEventHandler and exposing startNewChat/sendMessage via useImperativeHandle are good improvements to avoid stale closures and provide a clean imperative surface.

The [DEBUG] ChatWindow - handleNewChat... console.log is likely leftover instrumentation; if you don't intend to keep verbose logging in production, consider removing it:

-  const handleNewChat = useCallback(() => {
-    console.log('[DEBUG] ChatWindow - handleNewChat called, about to call chatService.newThread()');
+  const handleNewChat = useCallback(() => {
     chatService.newThread();

Also applies to: 80-83, 261-263, 278-281

src/plugins/chat/public/components/chat_header_button.tsx (1)

185-190: Availability guard is correct; consider avoiding side effects when chat is disabled

Using core.chat.isAvailable() to short‑circuit rendering is a good way to hide the header button when chat is disabled, and renaming the tools callback arg to _tools is a nice lint cleanup.

Note that because the guard is after all hooks, the component still sets up chatService subscriptions and sidecar handlers even when chat is unavailable. That’s probably fine, but if you want to avoid any side effects in the disabled case, consider a small wrapper:

  • ChatHeaderButton checks core.chat.isAvailable() and either returns null or renders an inner ChatHeaderButtonInner that contains the existing hook logic.

This keeps hooks unconditional in the inner component while skipping subscriptions entirely when chat is off.

Also applies to: 220-222

src/plugins/chat/public/services/chat_event_handler.test.ts (1)

203-257: sendToolResult mock aligns with ChatService contract and improves coverage

The updated test double for sendToolResult (returning { observable, toolMessage }) matches the expected shape and the new assertions correctly verify that a tool message with the JSON‑encoded result is added to the timeline and linked to the right toolCallId. The minimal observable stub with subscribe/unsubscribe is adequate given current usage.

src/core/public/mocks.ts (1)

52-53: CoreStart now correctly includes a chat mock; consider adding a setup mock when needed

Wiring coreChatServiceMock.createStartContract() into createCoreStartMock and re‑exporting coreChatServiceMock keeps tests aligned with the new core.chat surface and avoids ad‑hoc mocks in plugins.

If the core ChatService is (or becomes) exposed on CoreSetup as well, it would be worth mirroring this by adding a chat: coreChatServiceMock.createSetupContract() property in createCoreSetupMock to keep the mocked CoreSetup/Start shapes consistent.

Also applies to: 68-69, 102-121

src/plugins/chat/public/services/chat_event_handler.ts (1)

489-495: Consider adding a null check for toolMessage before updating timeline.

The destructured toolMessage could potentially be undefined if sendToolResult doesn't return it in all cases. Adding a guard would prevent adding undefined to the timeline.

-      const { observable, toolMessage } = await (this.chatService as any).sendToolResult(
+      const { observable, toolMessage } = await (this.chatService as any).sendToolResult(
         toolCallId,
         result,
         messages
       );

-      this.onTimelineUpdate((prev) => [...prev, toolMessage]);
+      if (toolMessage) {
+        this.onTimelineUpdate((prev) => [...prev, toolMessage]);
+      }
src/plugins/chat/server/routes/index.test.ts (1)

44-52: Mock capabilities resolver setup is unused in some test paths.

The mockCapabilitiesResolver is initialized in beforeEach but some tests (e.g., lines 72-120, 122-138) call testSetup without passing a capabilities resolver, making this setup ineffective for those tests. This is fine since those tests verify the "no capabilities resolver" scenario, but consider adding a brief comment clarifying the distinction between tests that use the mock vs. those that intentionally omit it.

src/plugins/chat/server/routes/ml_routes/generic_ml_router.ts (1)

155-159: Fragile 404 detection via string matching.

Checking error.message.includes('404') may produce false positives (e.g., if "404" appears in an unrelated error message) or false negatives (if the error format changes). Consider checking for a status code property on the error object if available.

src/plugins/chat/public/plugin.ts (1)

141-141: Verify non-null assertion is safe in mount callback timing.

The non-null assertion this.chatService! assumes the mount callback is only invoked after start() has initialized chatService. While this is typically guaranteed by the plugin lifecycle, consider adding a guard for defensive coding:

         const mountPoint = toMountPoint(
           React.createElement(ChatHeaderButton, {
             core,
-            chatService: this.chatService!,
+            chatService: this.chatService,
             contextProvider: deps.contextProvider,
             charts: deps.charts,
             suggestedActionsService: this.suggestedActionsService!,
           })
         );

If ChatHeaderButton can handle an undefined chatService gracefully, this would be safer. Otherwise, the current assertion is acceptable given the lifecycle guarantees.

src/plugins/chat/server/routes/index.ts (1)

119-121: Lazy initialization of ML router on every request.

MLAgentRouterRegistry.initialize(capabilities) is called on every request. While the registry guards against re-initialization internally, this pattern adds overhead. Consider initializing the router once during plugin setup if capabilities are static.

Based on the relevant code snippet from router_registry.ts, the registry has an initialized flag that prevents re-registration. This is acceptable for now, but if capabilities are known at setup time, moving initialization there would be cleaner.

src/plugins/chat/common/chat_capabilities.ts (1)

26-28: Consider narrowing the any type for capabilities.

While using any for capabilities is pragmatic for cross-environment compatibility, consider defining a minimal interface or using a more specific type to improve type safety and developer experience.

+interface ChatCapabilities {
+  investigation?: {
+    agenticFeaturesEnabled?: boolean;
+  };
+}
+
-export function hasInvestigationCapabilities(capabilities?: any): boolean {
+export function hasInvestigationCapabilities(capabilities?: ChatCapabilities): boolean {
   return capabilities?.investigation?.agenticFeaturesEnabled === true;
 }
src/plugins/chat/public/services/chat_service.test.ts (1)

183-214: Thread ID uniqueness test relies on timing for differentiation.

The test creates two separate mock core services with thread IDs generated at slightly different times (using Date.now() and Date.now() + 1). While this works, it couples test correctness to timing behavior.

Consider using deterministic mock IDs for clearer test intent:

-      const generateThreadId1 = () =>
-        `thread-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
-      const generateThreadId2 = () =>
-        `thread-${Date.now() + 1}-${Math.random().toString(36).substring(2, 11)}`;
+      const mockThreadId1 = 'thread-1000000000001-abcdefghi';
+      const mockThreadId2 = 'thread-1000000000002-jklmnopqr';
 
-      const mockThreadId1$ = new BehaviorSubject<string>(generateThreadId1());
-      const mockThreadId2$ = new BehaviorSubject<string>(generateThreadId2());
+      const mockThreadId1$ = new BehaviorSubject<string>(mockThreadId1);
+      const mockThreadId2$ = new BehaviorSubject<string>(mockThreadId2);
src/core/public/chat/chat_service.ts (1)

169-174: Consider completing the BehaviorSubjects in stop() for clean shutdown.

The threadId$ and windowState$ BehaviorSubjects are not completed during stop(). While typically acceptable for core services, completing them would signal to any remaining subscribers that the service is shutting down.

   public async stop() {
     this.implementation = undefined;
     this.suggestedActionsService = undefined;
     this.windowOpenCallbacks.clear();
     this.windowCloseCallbacks.clear();
+    this.threadId$.complete();
+    this.windowState$.complete();
   }
src/plugins/chat/public/services/chat_service.ts (4)

283-306: Consider extracting shared context/runInput building logic.

Both sendMessage and sendToolResult duplicate the pattern of:

  1. Getting workspace-aware data source ID
  2. Fetching and transforming contexts from assistantContextStore
  3. Building RunAgentInput with similar structure
  4. Wrapping the observable for tracking

A private helper like buildRunContext() could reduce duplication and ensure consistency.

Also applies to: 348-375


62-74: Repetitive availability checks could be consolidated.

The pattern of throwing "Core chat service not available" is repeated across many methods. Consider either:

  1. Making coreChatService a required constructor parameter
  2. Adding a private requireCoreChatService() helper that throws if unavailable
+  private requireCoreChatService(): ChatServiceStart {
+    if (!this.coreChatService) {
+      throw new Error('Core chat service not available');
+    }
+    return this.coreChatService;
+  }
+
   public getThreadId = () => {
-    if (!this.coreChatService) {
-      throw new Error('Core chat service not available');
-    }
-    return this.coreChatService.getThreadId();
+    return this.requireCoreChatService().getThreadId();
   };

Also applies to: 98-155


219-222: Silent catch block swallows errors without logging.

The empty catch block on lines 219-221 silently falls back to direct service call, but swallowing the error makes debugging difficult. Consider adding a warning log:

       } catch (error) {
         // Fall back to direct service call if delegation fails
+        // eslint-disable-next-line no-console
+        console.warn('ChatWindow delegation failed, falling back to direct call:', error);
       }

287-294: Global window object access for context store is a code smell.

Accessing (window as any).assistantContextStore couples this service to a global object. While this may be existing legacy code, consider injecting the context store as a dependency in a future refactor.

src/core/public/chat/types.ts (3)

71-77: ToolMessage doesn't extend BaseMessage unlike other message types.

All other message types extend BaseMessage, but ToolMessage defines id, content, and role directly. This inconsistency could cause issues if code expects all messages to have BaseMessage properties like name.

Consider extending BaseMessage for consistency:

-export interface ToolMessage {
-  id: string;
-  content: string;
+export interface ToolMessage extends BaseMessage {
   role: 'tool';
+  content: string;
   toolCallId: string;
   error?: string;
 }

135-143: The observable: any return type loses type safety.

Both ChatServiceInterface and ChatImplementationFunctions use any for the observable return type. Consider defining a proper type for the observable emissions to improve type safety and developer experience.

For example:

import { Observable } from 'rxjs';

interface ChatEvent {
  type: 'message' | 'tool_call' | 'error' | 'complete';
  // ... event-specific properties
}

sendMessage(...): Promise<{ observable: Observable<ChatEvent>; userMessage: UserMessage }>;

Also applies to: 151-160


181-181: suggestedActionsService.registerProvider uses any for provider type.

Consider defining a proper interface for the provider parameter to improve type safety. If a SuggestedActionProvider interface exists elsewhere, it should be referenced here.

Also applies to: 187-189, 200-202

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7038a73 and 649cb3d.

⛔ Files ignored due to path filters (1)
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (53)
  • changelogs/fragments/10983.yml (1 hunks)
  • src/core/public/chat/chat_service.mock.ts (1 hunks)
  • src/core/public/chat/chat_service.test.ts (1 hunks)
  • src/core/public/chat/chat_service.ts (1 hunks)
  • src/core/public/chat/index.ts (1 hunks)
  • src/core/public/chat/types.ts (1 hunks)
  • src/core/public/core_system.ts (9 hunks)
  • src/core/public/index.ts (4 hunks)
  • src/core/public/mocks.ts (3 hunks)
  • src/core/public/plugins/plugin_context.ts (2 hunks)
  • src/core/public/plugins/plugins_service.test.ts (3 hunks)
  • src/plugins/chat/common/chat_capabilities.test.ts (1 hunks)
  • src/plugins/chat/common/chat_capabilities.ts (1 hunks)
  • src/plugins/chat/common/types.ts (2 hunks)
  • src/plugins/chat/opensearch_dashboards.json (1 hunks)
  • src/plugins/chat/public/actions/graph_timeseries_data_action.test.tsx (1 hunks)
  • src/plugins/chat/public/actions/graph_timeseries_data_action.tsx (2 hunks)
  • src/plugins/chat/public/components/chat_header_button.test.tsx (14 hunks)
  • src/plugins/chat/public/components/chat_header_button.tsx (2 hunks)
  • src/plugins/chat/public/components/chat_window.tsx (3 hunks)
  • src/plugins/chat/public/components/graph_visualization/error_boundary.tsx (0 hunks)
  • src/plugins/chat/public/components/graph_visualization/error_display.tsx (0 hunks)
  • src/plugins/chat/public/components/graph_visualization/error_handler.ts (0 hunks)
  • src/plugins/chat/public/components/graph_visualization/validation.ts (0 hunks)
  • src/plugins/chat/public/plugin.test.ts (4 hunks)
  • src/plugins/chat/public/plugin.ts (5 hunks)
  • src/plugins/chat/public/services/ag_ui_agent.ts (2 hunks)
  • src/plugins/chat/public/services/chat_context_manager.test.ts (0 hunks)
  • src/plugins/chat/public/services/chat_context_manager.ts (0 hunks)
  • src/plugins/chat/public/services/chat_event_handler.test.ts (1 hunks)
  • src/plugins/chat/public/services/chat_event_handler.ts (1 hunks)
  • src/plugins/chat/public/services/chat_service.test.ts (15 hunks)
  • src/plugins/chat/public/services/chat_service.ts (15 hunks)
  • src/plugins/chat/public/types.ts (2 hunks)
  • src/plugins/chat/server/index.ts (1 hunks)
  • src/plugins/chat/server/plugin.ts (1 hunks)
  • src/plugins/chat/server/routes/index.test.ts (4 hunks)
  • src/plugins/chat/server/routes/index.ts (3 hunks)
  • src/plugins/chat/server/routes/ml_routes/generic_ml_router.ts (1 hunks)
  • src/plugins/chat/server/routes/ml_routes/ml_agent_router.ts (1 hunks)
  • src/plugins/chat/server/routes/ml_routes/ml_commons_agent.test.ts (0 hunks)
  • src/plugins/chat/server/routes/ml_routes/ml_commons_agent.ts (0 hunks)
  • src/plugins/chat/server/routes/ml_routes/router_registry.ts (1 hunks)
  • src/plugins/data_source_management/public/index.ts (1 hunks)
  • src/plugins/explore/opensearch_dashboards.json (1 hunks)
  • src/plugins/explore/public/actions/ask_ai_action.test.ts (3 hunks)
  • src/plugins/explore/public/actions/ask_ai_action.ts (1 hunks)
  • src/plugins/explore/public/build_services.ts (1 hunks)
  • src/plugins/explore/public/components/ask_ai_action_item/ask_ai_action_item.test.tsx (3 hunks)
  • src/plugins/explore/public/components/ask_ai_action_item/ask_ai_action_item.tsx (3 hunks)
  • src/plugins/explore/public/components/tabs/action_bar/action_bar.tsx (2 hunks)
  • src/plugins/explore/public/plugin.ts (1 hunks)
  • src/plugins/explore/public/types.ts (1 hunks)
💤 Files with no reviewable changes (8)
  • src/plugins/chat/public/components/graph_visualization/validation.ts
  • src/plugins/chat/public/components/graph_visualization/error_handler.ts
  • src/plugins/chat/public/components/graph_visualization/error_display.tsx
  • src/plugins/chat/public/components/graph_visualization/error_boundary.tsx
  • src/plugins/chat/public/services/chat_context_manager.test.ts
  • src/plugins/chat/server/routes/ml_routes/ml_commons_agent.test.ts
  • src/plugins/chat/public/services/chat_context_manager.ts
  • src/plugins/chat/server/routes/ml_routes/ml_commons_agent.ts
🧰 Additional context used
🧬 Code graph analysis (25)
src/plugins/chat/server/routes/ml_routes/router_registry.ts (3)
src/plugins/chat/common/chat_capabilities.ts (1)
  • hasInvestigationCapabilities (26-28)
src/plugins/chat/server/routes/ml_routes/ml_agent_router.ts (1)
  • MLAgentRouterFactory (49-74)
src/plugins/chat/server/routes/ml_routes/generic_ml_router.ts (1)
  • GenericMLRouter (79-176)
src/plugins/explore/public/components/tabs/action_bar/action_bar.tsx (1)
src/plugins/opensearch_dashboards_utils/public/index.ts (1)
  • of (41-41)
src/plugins/chat/server/routes/ml_routes/ml_agent_router.ts (1)
src/core/server/index.ts (4)
  • RequestHandlerContext (436-460)
  • OpenSearchDashboardsRequest (187-187)
  • OpenSearchDashboardsResponseFactory (215-215)
  • IOpenSearchDashboardsResponse (191-191)
src/core/public/chat/chat_service.test.ts (2)
src/core/public/chat/chat_service.ts (1)
  • ChatService (19-175)
src/core/public/chat/types.ts (1)
  • ChatImplementationFunctions (149-165)
src/core/public/index.ts (2)
src/core/public/chat/types.ts (2)
  • ChatServiceSetup (170-190)
  • ChatServiceStart (195-203)
src/core/public/chat/index.ts (2)
  • ChatServiceSetup (8-8)
  • ChatServiceStart (9-9)
src/plugins/chat/common/chat_capabilities.ts (1)
src/plugins/chat/server/index.ts (1)
  • config (13-19)
src/plugins/chat/common/chat_capabilities.test.ts (2)
src/plugins/chat/common/chat_capabilities.ts (4)
  • hasInvestigationCapabilities (26-28)
  • ContextProviderConfig (17-19)
  • ChatConfig (9-12)
  • isChatEnabled (42-59)
src/plugins/chat/server/index.ts (1)
  • config (13-19)
src/plugins/explore/public/actions/ask_ai_action.ts (2)
src/core/public/chat/types.ts (1)
  • ChatServiceStart (195-203)
src/core/public/index.ts (1)
  • ChatServiceStart (440-440)
src/plugins/chat/public/services/chat_event_handler.test.ts (1)
src/core/public/chat/types.ts (1)
  • ToolMessage (71-77)
src/plugins/chat/server/routes/index.ts (3)
src/core/server/index.ts (1)
  • OpenSearchDashboardsRequest (187-187)
src/plugins/chat/server/routes/ml_routes/router_registry.ts (1)
  • MLAgentRouterRegistry (16-50)
src/plugins/chat/server/routes/ml_routes/ml_agent_router.ts (1)
  • MLAgentRouterFactory (49-74)
src/plugins/explore/public/build_services.ts (2)
src/plugins/explore/public/services/slot_registry/index.ts (1)
  • SlotRegistryService (7-7)
src/plugins/explore/public/services/slot_registry/slot_registry_service.ts (1)
  • SlotRegistryService (65-116)
src/core/public/core_system.ts (2)
src/core/public/chat/chat_service.ts (1)
  • ChatService (19-175)
src/plugins/chat/public/services/chat_service.ts (1)
  • ChatService (31-481)
src/plugins/chat/public/types.ts (1)
src/plugins/data_source_management/public/index.ts (1)
  • DataSourceManagementPluginSetup (18-18)
src/plugins/explore/public/components/ask_ai_action_item/ask_ai_action_item.test.tsx (3)
src/core/public/chat/types.ts (1)
  • ChatServiceStart (195-203)
src/core/public/chat/index.ts (1)
  • ChatServiceStart (9-9)
src/core/public/index.ts (1)
  • ChatServiceStart (440-440)
src/plugins/chat/public/components/chat_window.tsx (1)
src/core/public/chat/types.ts (1)
  • Message (82-87)
src/core/public/plugins/plugins_service.test.ts (3)
src/core/public/chat/chat_service.mock.ts (1)
  • coreChatServiceMock (50-53)
src/core/public/chat/index.ts (1)
  • coreChatServiceMock (24-24)
src/core/public/mocks.ts (1)
  • coreChatServiceMock (68-68)
src/plugins/explore/public/components/ask_ai_action_item/ask_ai_action_item.tsx (3)
src/plugins/explore/public/types/log_actions.ts (1)
  • LogActionItemProps (37-46)
src/core/public/chat/types.ts (1)
  • ChatServiceStart (195-203)
src/plugins/context_provider/public/hooks/use_dynamic_context.ts (1)
  • useDynamicContext (18-78)
src/core/public/mocks.ts (2)
src/core/public/chat/chat_service.mock.ts (1)
  • coreChatServiceMock (50-53)
src/core/public/chat/index.ts (1)
  • coreChatServiceMock (24-24)
src/core/public/chat/chat_service.ts (4)
src/core/public/chat/index.ts (6)
  • ChatService (23-23)
  • ChatServiceSetup (8-8)
  • ChatServiceStart (9-9)
  • ChatImplementationFunctions (10-10)
  • ChatWindowState (20-20)
  • Message (11-11)
src/core/public/chat/types.ts (5)
  • ChatServiceSetup (170-190)
  • ChatServiceStart (195-203)
  • ChatImplementationFunctions (149-165)
  • ChatWindowState (97-101)
  • Message (82-87)
src/core/public/index.ts (5)
  • ChatServiceSetup (439-439)
  • ChatServiceStart (440-440)
  • ChatImplementationFunctions (441-441)
  • ChatWindowState (443-443)
  • Message (442-442)
src/plugins/chat/common/types.ts (1)
  • Message (12-12)
src/core/public/chat/chat_service.mock.ts (1)
src/core/public/chat/types.ts (2)
  • ChatServiceSetup (170-190)
  • ChatServiceStart (195-203)
src/plugins/chat/server/routes/ml_routes/generic_ml_router.ts (2)
src/core/server/index.ts (4)
  • RequestHandlerContext (436-460)
  • OpenSearchDashboardsRequest (187-187)
  • OpenSearchDashboardsResponseFactory (215-215)
  • IOpenSearchDashboardsResponse (191-191)
src/plugins/chat/server/routes/ml_routes/ml_agent_router.ts (1)
  • MLAgentRouter (19-43)
src/plugins/chat/public/actions/graph_timeseries_data_action.test.tsx (1)
src/plugins/chat/public/actions/graph_timeseries_data_action.tsx (1)
  • useGraphTimeseriesDataAction (42-250)
src/plugins/chat/public/services/ag_ui_agent.ts (1)
src/plugins/chat/common/types.ts (1)
  • RunAgentInput (111-111)
src/plugins/chat/server/routes/index.test.ts (1)
src/plugins/chat/server/routes/index.ts (1)
  • defineRoutes (81-161)
src/plugins/explore/public/actions/ask_ai_action.test.ts (2)
src/core/public/chat/types.ts (1)
  • ChatServiceStart (195-203)
src/plugins/explore/public/actions/ask_ai_action.ts (1)
  • createAskAiAction (13-29)
🪛 YAMLlint (1.37.1)
changelogs/fragments/10983.yml

[error] 2-2: syntax error: expected , but found ''

(syntax)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (67)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup1)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup3)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup7)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run functional tests on Linux (ciGroup4)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup2)
  • GitHub Check: Run functional tests on Linux (ciGroup1)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Build min release artifacts on Windows x64
  • GitHub Check: Run cypress tests (osd:ciGroup10Fast)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup8)
  • GitHub Check: Build min release artifacts on macOS ARM64
  • GitHub Check: Run cypress tests (osd:ciGroup9)
  • GitHub Check: Run cypress tests (osd:ciGroup10Slow)
  • GitHub Check: Build min release artifacts on macOS x64
  • GitHub Check: Build min release artifacts on Linux x64
  • GitHub Check: Run plugin functional tests on Linux
  • GitHub Check: Build min release artifacts on Linux ARM64
  • GitHub Check: Run cypress tests (osd:ciGroup6)
  • GitHub Check: Run cypress tests (osd:ciGroup4)
  • GitHub Check: Run cypress tests (osd:ciGroup3)
  • GitHub Check: Run plugin functional tests on Windows
  • GitHub Check: Run cypress tests (osd:ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup7)
  • GitHub Check: Build and Verify on Windows (ciGroup4)
  • GitHub Check: Build and Verify on Linux (ciGroup1)
  • GitHub Check: Run cypress tests (osd:ciGroup1)
  • GitHub Check: Run cypress tests (osd:ciGroup2)
  • GitHub Check: bundle-analyzer
  • GitHub Check: Build and Verify on Linux (ciGroup2)
  • GitHub Check: Build and Verify on Windows (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup1)
  • GitHub Check: Build and Verify on Linux (ciGroup3)
  • GitHub Check: Build and Verify on Windows (ciGroup2)
  • GitHub Check: Lint and validate
  • GitHub Check: lighthouse
🔇 Additional comments (53)
src/plugins/chat/public/types.ts (1)

9-25: Wiring optional DataSourceManagement into chat start deps looks correct

The new DataSourceManagementPluginSetup import and optional dataSourceManagement field on AppPluginStartDependencies are consistent with how other plugin deps are modeled and keep the dependency truly optional at runtime.

src/plugins/explore/opensearch_dashboards.json (1)

24-25: Removing chat from Explore optionalPlugins matches core chat integration

Now that Explore consumes chat via the core ChatService surface, dropping chat from optionalPlugins avoids unnecessary plugin coupling and startup ordering constraints.

src/plugins/chat/public/actions/graph_timeseries_data_action.tsx (1)

42-49: Enabled flag is correctly threaded through to the assistant action

The new enabled: boolean = true parameter cleanly propagates into useAssistantAction, preserving default behavior while allowing callers to disable the action when needed.

Also applies to: 248-249

src/plugins/data_source_management/public/index.ts (1)

29-29: Exposing getWorkspaces via the DSM public API is consistent with existing helpers

Adding getWorkspaces next to getDefaultDataSourceId/getDefaultDataSourceId$ is a natural extension of the public surface for workspace-aware data source handling.

src/plugins/chat/server/index.ts (1)

13-18: Exposing enabled to the browser is appropriate for client-side chat gating

Including enabled: true in exposeToBrowser lets the public chat plugin honor server-side configuration without exposing any sensitive data, and complements the already-exposed agUiUrl.

src/plugins/chat/server/plugin.ts (1)

15-30: Capabilities resolver typing is consistent with core API

Importing Capabilities and typing capabilitiesResolver as returning Promise<Capabilities> matches core.capabilities.resolveCapabilities and improves type safety without changing behavior. No further changes needed here.

src/plugins/chat/opensearch_dashboards.json (1)

13-15: DSM as optional plugin but required bundle

Declaring dataSourceManagement as an optional plugin while requiring its bundle is a reasonable way to share its UI without hard runtime coupling. Please just confirm chat’s flows are exercised on a deployment without the DSM plugin installed to ensure the feature gates and fallbacks behave as expected.

src/plugins/explore/public/types.ts (1)

182-187: Making slotRegistry optional matches new usage

Changing slotRegistry to slotRegistry?: SlotRegistryService aligns with the new safe-access pattern in action_bar.tsx and reflects that Explore can run without a slot registry. This looks consistent and should be safe for consumers.

src/plugins/explore/public/plugin.ts (1)

515-517: Always registering Ask AI and delegating enablement is reasonable

Creating the Ask AI action unconditionally with core.chat and letting its isCompatible logic handle enablement is a good separation of concerns, provided createAskAiAction fully respects chat availability/capabilities and that core.chat is always defined on CoreStart.

src/plugins/explore/public/components/tabs/action_bar/action_bar.tsx (1)

7-8: Safe fallback when slotRegistry is absent

Using optional chaining plus of([]) ensures sortedSlotItems$ is always a valid observable and avoids crashes when slotRegistry is undefined. The useMemo dependency is correct and keeps the observable instance stable. Looks good as-is.

Also applies to: 30-32

src/core/public/plugins/plugin_context.ts (2)

127-127: LGTM!

The chat service is correctly propagated to the plugin setup context, following the same pattern as other core services like workspaces and keyboardShortcut.


183-183: LGTM!

The chat service is correctly propagated to the plugin start context, maintaining consistency with the setup context pattern.

src/plugins/chat/public/services/ag_ui_agent.ts (2)

31-31: LGTM!

The optional dataSourceId parameter is a backward-compatible addition that enables workspace-aware data source handling.


48-53: LGTM!

The URL construction correctly handles the optional dataSourceId query parameter with proper URL encoding via encodeURIComponent.

src/plugins/explore/public/components/ask_ai_action_item/ask_ai_action_item.test.tsx (2)

9-9: LGTM!

The import correctly references ChatServiceStart from the new core public API location, aligning with the refactored architecture.


34-47: LGTM!

The mock object correctly implements all required methods from the ChatServiceStart interface. The stub implementations with jest.fn() are appropriate for these component-level tests.

src/plugins/chat/public/actions/graph_timeseries_data_action.test.tsx (2)

62-62: LGTM!

The assertion correctly verifies that enabled defaults to true when no parameter is passed, matching the function signature useGraphTimeseriesDataAction(enabled: boolean = true).


65-96: LGTM!

The new tests comprehensively cover the enabled flag behavior:

  • Explicitly passing true registers the action as enabled
  • Explicitly passing false registers the action as disabled

This provides good coverage for the optional parameter handling.

src/plugins/chat/public/services/chat_event_handler.ts (1)

304-306: Multiple uses of (this.chatService as any) indicate a typing gap.

The sendToolResult method is accessed via type casting at lines 304, 330, and 489. Consider updating the ChatService interface to include the sendToolResult method signature to improve type safety and IDE support.

src/plugins/explore/public/components/ask_ai_action_item/ask_ai_action_item.tsx (1)

18-18: LGTM! Import and type updated to use core chat service.

The import path and type have been correctly updated to use ChatServiceStart from the core public API, aligning with the refactored chat architecture.

Also applies to: 24-24

src/core/public/plugins/plugins_service.test.ts (1)

63-63: LGTM! Test scaffolding updated to include chat service.

The chat service mock has been properly integrated into the test setup and start dependency mocks, ensuring tests reflect the new core chat service integration.

Also applies to: 117-117, 139-139

src/plugins/chat/common/chat_capabilities.test.ts (1)

1-106: LGTM! Comprehensive test coverage for chat capabilities.

The test suite thoroughly validates the capability checking logic across various scenarios including:

  • Open source environments with agUiUrl configured
  • Production environments with investigation feature flags
  • Proper handling of disabled configurations
  • Safe defaults for undefined/empty capabilities
src/plugins/chat/server/routes/ml_routes/router_registry.ts (1)

1-50: LGTM! Clean router registry implementation.

The MLAgentRouterRegistry provides a clean singleton pattern for managing ML agent router lifecycle:

  • Proper initialization guard prevents duplicate registration
  • Capability-based router selection aligns with the PR's feature-gating approach
  • reset() method supports testing scenarios
src/plugins/chat/public/components/chat_header_button.test.tsx (2)

33-33: LGTM! Test setup enhanced with config and capabilities.

The test setup now includes mock configuration and capability flags, enabling proper testing of feature-gated chat functionality.

Also applies to: 68-78


323-445: LGTM! Comprehensive feature flag visibility tests.

The new test suite thoroughly validates rendering behavior across different capability scenarios:

  • Properly tests availability gating via core.chat.isAvailable()
  • Validates open-source environment behavior (undefined capabilities)
  • Ensures hooks are called consistently regardless of availability (lines 422-444) - this is important for React's rules of hooks
src/core/public/index.ts (1)

106-106: LGTM! Core public API extended with chat service.

The chat service has been properly integrated into the core public API:

  • CoreSetup and CoreStart interfaces extended with chat fields
  • Necessary types exported for plugin consumption
  • Consistent JSDoc annotations

Also applies to: 296-297, 356-357, 437-444

src/plugins/explore/public/actions/ask_ai_action.ts (1)

8-8: LGTM! Action updated to use core chat service.

The changes properly migrate to the core ChatServiceStart:

  • Import path updated to core public API
  • Function signature now requires ChatServiceStart (no longer optional)
  • isAvailable() method provides cleaner availability checking
  • Removed unnecessary non-null assertion

Also applies to: 13-13, 21-21, 25-26

src/core/public/core_system.ts (4)

60-60: LGTM! ChatService integrated into core system.

The ChatService has been properly instantiated and added as a private field in the CoreSystem class.

Also applies to: 119-119, 149-149


178-178: LGTM! Chat service wired into setup phase.

The chat service is properly initialized during setup and included in the InternalCoreSetup contract, making it available to plugins during their setup phase.

Also applies to: 200-200


247-248: LGTM! Chat service wired into start phase and application context.

The chat service is:

  • Started during the core start phase (line 248)
  • Included in the application mount context (line 284) for plugin access
  • Exposed in the InternalCoreStart contract (line 301)

This ensures plugins can access the chat service at runtime.

Also applies to: 284-284, 301-301


354-354: LGTM! Chat service properly cleaned up.

The chat service's stop() method is called during CoreSystem.stop(), ensuring proper cleanup of subscriptions and resources.

src/core/public/chat/index.ts (1)

6-24: LGTM!

Clean barrel file that provides a well-organized public API surface for the chat subsystem. The exports are logically grouped by source module.

src/plugins/explore/public/build_services.ts (1)

28-29: LGTM!

Making isDatasetManagementEnabled default to false and slotRegistry optional aligns with the broader refactoring to decouple dependencies. This provides flexibility for callers without breaking existing consumers.

src/plugins/chat/server/routes/index.test.ts (1)

251-431: Good test coverage for ML integration routing scenarios.

The "Generic ML Integration" test suite comprehensively covers the key routing decision paths, including capability-based routing, fallback scenarios, and error conditions. The tests properly verify that AG-UI is used as the fallback when ML routing conditions aren't met.

src/plugins/chat/server/routes/ml_routes/ml_agent_router.ts (1)

49-73: LGTM!

The MLAgentRouterFactory provides a clean singleton-like abstraction for managing the ML router instance. The clearRouters() method appropriately enables test isolation. The interface is well-documented with clear JSDoc comments.

src/core/public/chat/chat_service.test.ts (1)

9-194: Comprehensive test coverage for ChatService.

The tests thoroughly cover the ChatService lifecycle including setup, start, and stop phases. Key areas validated:

  • Contract shape verification
  • Availability state with/without implementation
  • Thread ID and window state management via observables
  • Callback invocation on window state changes
  • Error handling when implementation is missing
  • Delegation to implementation when available
src/core/public/chat/chat_service.mock.ts (1)

9-53: LGTM!

The mock implementation provides a complete and consistent test surface for both setup and start contracts. Default values appropriately mirror the expected initial state of the ChatService. The use of BehaviorSubject for observable mocks correctly reflects the real implementation behavior.

src/plugins/chat/public/plugin.ts (2)

84-91: Storing CoreSetup for later use is appropriate.

The pattern of storing CoreSetup during setup phase for use in the start phase is a common approach when plugin lifecycle methods need access to setup-phase resources.


114-129: Good defensive registration with optional chaining.

The conditional checks (this.coreSetup?.chat?.setImplementation) safely handle scenarios where the core chat service may not be available, preventing runtime errors during plugin initialization.

src/plugins/chat/server/routes/index.ts (1)

104-108: LGTM on dataSourceId query parameter support.

The optional dataSourceId query parameter is properly validated with schema.maybe() and correctly passed through to both the ML router and AG-UI proxy paths.

src/plugins/chat/common/chat_capabilities.ts (1)

42-59: Well-structured unified enablement logic.

The isChatEnabled function provides clear, documented logic with proper layering: base requirements first, then environment-specific checks. The JSDoc documentation effectively communicates the function's purpose.

src/plugins/explore/public/actions/ask_ai_action.test.ts (2)

20-34: Mock structure properly aligns with ChatServiceStart interface.

The mock correctly implements the expected surface of ChatServiceStart including isAvailable, sendMessageWithWindow, thread/window state methods, and the optional suggestedActionsService. This aligns with the type definition shown in the relevant code snippet.


56-68: Good test coverage for availability states.

The tests properly verify both the available and unavailable states by creating separate mock instances with different isAvailable return values. This ensures the isCompatible logic is thoroughly tested.

src/plugins/chat/common/types.ts (2)

8-19: Clean type consolidation pattern.

Re-exporting type definitions from core/public/chat while keeping Zod schemas locally is a good separation of concerns. The core owns the canonical type definitions, while the plugin retains runtime validation capability.


21-83: Verify Zod schemas remain in sync with core type definitions.

The Zod schemas define the runtime validation shape independently from the re-exported TypeScript types. If the core types evolve, these schemas may become inconsistent.

Consider adding a compile-time check to ensure schema inference aligns with core types:

import type { Message } from '../../../core/public/chat';
import { z } from 'zod';

// After MessageSchema definition:
type SchemaMessage = z.infer<typeof MessageSchema>;
// This will cause a compile error if schemas diverge from core types:
const _typeCheck: SchemaMessage = {} as Message;
src/plugins/chat/public/services/chat_service.test.ts (3)

42-102: Comprehensive and well-structured mock for core chat service.

The mock properly implements observable-based state management with BehaviorSubject, simulates callback registration/cleanup, and provides realistic behavior for window and thread state changes. This aligns well with the core ChatServiceStart interface.


753-760: Test comment acknowledges implementation-dependent behavior.

The comment correctly notes that core service behavior for duplicate values is implementation-dependent. This is a pragmatic approach when testing delegation to an external service.


274-286: Test assertions properly verify dataSourceId handling.

The tests correctly verify that runAgent is called with undefined for dataSourceId when no uiSettings are provided. The explicit comment clarifies this expected behavior.

src/core/public/chat/chat_service.ts (2)

58-67: Callbacks are invoked before the state observable is updated.

The open/close callbacks at lines 61-64 are triggered before this.windowState$.next(newState) on line 67. If any callback reads getWindowState() or isWindowOpen(), it will receive the old state, not the new one.

Consider whether this ordering is intentional. If callbacks should see the updated state:

-      // Trigger callbacks on window state change
-      if (currentState.isWindowOpen !== newState.isWindowOpen) {
-        if (newState.isWindowOpen) {
-          this.windowOpenCallbacks.forEach((callback) => callback());
-        } else {
-          this.windowCloseCallbacks.forEach((callback) => callback());
-        }
-      }
-
       this.windowState$.next(newState);
+
+      // Trigger callbacks after state update so callbacks see the new state
+      if (currentState.isWindowOpen !== newState.isWindowOpen) {
+        if (newState.isWindowOpen) {
+          this.windowOpenCallbacks.forEach((callback) => callback());
+        } else {
+          this.windowCloseCallbacks.forEach((callback) => callback());
+        }
+      }

120-140: Verify the plugin's openWindow/closeWindow implementations don't create circular calls.

The core service calls this.implementation.openWindow() and then updates state via setWindowState(). If the plugin's implementation also calls back to the core service to update state, this could result in unexpected behavior or double state updates.

Ensure ChatImplementationFunctions.openWindow() and closeWindow() only handle plugin-specific logic (e.g., rendering the window) without calling back to coreChatService.setWindowState() or other state management methods.

src/plugins/chat/public/services/chat_service.ts (2)

54-60: Constructor logic can throw before object is fully initialized.

At line 55, if currentChatState?.threadId is truthy but this.coreChatService is set, setThreadId is called. However, later at line 409, saveCurrentChatState calls this.getThreadId() which throws if coreChatService is undefined.

The constructor itself is safe since it checks this.coreChatService before calling setThreadId, but if coreChatService is not provided, later calls to methods like saveCurrentChatState or newThread will throw. This might be intentional, but verify this degraded behavior is acceptable.


229-265: LGTM on workspace-aware data source resolution.

The implementation properly handles fallbacks when UI settings or workspaces are unavailable, and the scope determination logic is correct. The console warnings are helpful for debugging without breaking functionality.

src/core/public/chat/types.ts (1)

82-93: Well-structured discriminated union for message types.

The Message union type with specific role literals enables proper type narrowing. The separate Role type alias is useful for generic role handling.

Comment on lines +1 to +2
refactor:
- [Chat] Refactor chat architecture: Extract shared infrastructure into a core chat service ([#10983](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/10983)) No newline at end of file
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Fix YAML syntax in changelog fragment (colon in unquoted scalar)

The current fragment is not valid YAML because the plain scalar on line 2 contains ": ":

refactor:
- [Chat] Refactor chat architecture: Extract shared infrastructure into a core chat service ([#10983](...))

Quote the string (and optionally indent the list item) to satisfy YAMLlint and prevent changelog generation failures:

-refactor:
-- [Chat] Refactor chat architecture: Extract shared infrastructure into a core chat service ([#10983](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/10983))
+refactor:
+  - "[Chat] Refactor chat architecture: Extract shared infrastructure into a core chat service ([#10983](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/10983))"
🧰 Tools
🪛 YAMLlint (1.37.1)

[error] 2-2: syntax error: expected , but found ''

(syntax)

🤖 Prompt for AI Agents
In changelogs/fragments/10983.yml around lines 1 to 2, the list item contains an
unquoted scalar with a colon which breaks YAML parsing; fix it by quoting the
entire list string (single or double quotes) and optionally indenting the list
item under refactor to produce valid YAML (e.g. refactor: newline - "Your quoted
string..."), ensuring the colon inside the message is inside the quotes so
YAMLlint and changelog generation succeed.

Comment on lines +39 to +51
public setup(): ChatServiceSetup {
return {
setImplementation: (implementation: ChatImplementationFunctions) => {
this.implementation = implementation;
},

setSuggestedActionsService: (service: { registerProvider(provider: any): void }) => {
this.suggestedActionsService = service;
},

suggestedActionsService: this.suggestedActionsService,
};
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

suggestedActionsService will always be undefined in the returned setup contract.

Line 49 captures this.suggestedActionsService at the moment setup() is called, before setSuggestedActionsService has been invoked. Consumers accessing suggestedActionsService from the setup contract will always get undefined.

If the intent is to expose the service after it's set, consider making it a getter:

   public setup(): ChatServiceSetup {
     return {
       setImplementation: (implementation: ChatImplementationFunctions) => {
         this.implementation = implementation;
       },

       setSuggestedActionsService: (service: { registerProvider(provider: any): void }) => {
         this.suggestedActionsService = service;
       },

-      suggestedActionsService: this.suggestedActionsService,
+      get suggestedActionsService() {
+        return this.suggestedActionsService;
+      },
     };
   }

Note: This requires a reference to the outer this, so you may need to adjust the implementation accordingly.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
public setup(): ChatServiceSetup {
return {
setImplementation: (implementation: ChatImplementationFunctions) => {
this.implementation = implementation;
},
setSuggestedActionsService: (service: { registerProvider(provider: any): void }) => {
this.suggestedActionsService = service;
},
suggestedActionsService: this.suggestedActionsService,
};
}
public setup(): ChatServiceSetup {
const self = this;
return {
setImplementation: (implementation: ChatImplementationFunctions) => {
this.implementation = implementation;
},
setSuggestedActionsService: (service: { registerProvider(provider: any): void }) => {
this.suggestedActionsService = service;
},
get suggestedActionsService() {
return self.suggestedActionsService;
},
};
}
🤖 Prompt for AI Agents
In src/core/public/chat/chat_service.ts around lines 39 to 51, the returned
setup object captures this.suggestedActionsService immediately so
suggestedActionsService will always be undefined for consumers; change the setup
return to expose the service lazily (e.g., define suggestedActionsService as a
getter or a function that returns this.suggestedActionsService) so callers see
the value after setSuggestedActionsService is called, ensure the getter
references the outer this (use a function or Object.defineProperty/get syntax)
and update the ChatServiceSetup typing to reflect the getter or accessor
signature.

Comment on lines +32 to +40
// Forward the request to AG-UI server using native fetch (Node 18+)
const agUiResponse = await fetch(agUiUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Accept: 'text/event-stream',
},
body: JSON.stringify(requestBody),
});
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Missing timeout on external fetch request.

The fetch call to the external AG-UI server has no timeout configured. If the AG-UI server becomes unresponsive, this request will hang indefinitely, potentially exhausting server resources.

+  const controller = new AbortController();
+  const timeoutId = setTimeout(() => controller.abort(), 30000); // 30 second timeout
+
   // Forward the request to AG-UI server using native fetch (Node 18+)
-  const agUiResponse = await fetch(agUiUrl, {
-    method: 'POST',
-    headers: {
-      'Content-Type': 'application/json',
-      Accept: 'text/event-stream',
-    },
-    body: JSON.stringify(requestBody),
-  });
+  try {
+    const agUiResponse = await fetch(agUiUrl, {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+        Accept: 'text/event-stream',
+      },
+      body: JSON.stringify(requestBody),
+      signal: controller.signal,
+    });
+    clearTimeout(timeoutId);

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In src/plugins/chat/server/routes/index.ts around lines 32 to 40, the external
fetch to agUiUrl has no timeout and can hang indefinitely; wrap the fetch in an
AbortController with a configurable timeout (e.g., set via env or a constant),
start a timer that calls controller.abort() after the timeout, pass
controller.signal to fetch, clear the timer after fetch completes, and handle
AbortError to return a sensible error/timeout response to avoid leaking
resources.

Comment on lines +51 to +52
// Convert Web ReadableStream to Node.js Readable stream
const reader = agUiResponse.body!.getReader();
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Potential null pointer dereference on response body.

The non-null assertion agUiResponse.body! can cause a runtime error if the response body is null, which can occur in certain edge cases (e.g., empty responses from server). Add a null check before accessing the reader.

+  if (!agUiResponse.body) {
+    return response.customError({
+      statusCode: 502,
+      body: {
+        message: 'AG-UI server returned empty response body',
+      },
+    });
+  }
+
   // Convert Web ReadableStream to Node.js Readable stream
-  const reader = agUiResponse.body!.getReader();
+  const reader = agUiResponse.body.getReader();
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// Convert Web ReadableStream to Node.js Readable stream
const reader = agUiResponse.body!.getReader();
if (!agUiResponse.body) {
return response.customError({
statusCode: 502,
body: {
message: 'AG-UI server returned empty response body',
},
});
}
// Convert Web ReadableStream to Node.js Readable stream
const reader = agUiResponse.body.getReader();
🤖 Prompt for AI Agents
In src/plugins/chat/server/routes/index.ts around lines 51-52, the code uses a
non-null assertion agUiResponse.body! which can throw if body is null; add an
explicit null check (or guard) before calling getReader() — if agUiResponse.body
is null, handle that case by returning an error/empty stream or throwing a
descriptive error; otherwise call const reader = agUiResponse.body.getReader()
safely. Ensure downstream code accounts for the early-return or thrown error.

Comment on lines +20 to +45
let cachedClientKey: string | null = null;
let detectionAttempted = false;

function findMLClient(context: RequestHandlerContext) {
// Use cached result if available
if (detectionAttempted) {
if (cachedClientKey) {
const contextItem = (context as any)[cachedClientKey];
return contextItem?.client;
}
return undefined;
}

// First-time detection - cache the result
for (const key of Object.keys(context)) {
const contextItem = (context as any)[key];
if (contextItem?.client?.request && typeof contextItem.client.request === 'function') {
cachedClientKey = key; // Cache the key name
detectionAttempted = true;
return contextItem.client;
}
}

detectionAttempted = true; // Mark as attempted even if not found
return undefined;
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Critical: Module-level caching breaks across requests with different contexts.

The cachedClientKey and detectionAttempted flags persist across all requests for the lifetime of the server process. This causes issues:

  1. If the first request lacks an ML client, detectionAttempted = true is set and all subsequent requests will skip detection, even if they have a valid ML client in context.
  2. Different requests may have different context structures (e.g., multi-tenant, different data sources), but the cache assumes a uniform structure.

Consider detecting the ML client per-request, or scope caching to the request context:

-let cachedClientKey: string | null = null;
-let detectionAttempted = false;
-
-function findMLClient(context: RequestHandlerContext) {
-  // Use cached result if available
-  if (detectionAttempted) {
-    if (cachedClientKey) {
-      const contextItem = (context as any)[cachedClientKey];
-      return contextItem?.client;
-    }
-    return undefined;
-  }
-
-  // First-time detection - cache the result
+function findMLClient(context: RequestHandlerContext) {
+  // Detect ML client on each request - context may vary between requests
   for (const key of Object.keys(context)) {
     const contextItem = (context as any)[key];
     if (contextItem?.client?.request && typeof contextItem.client.request === 'function') {
-      cachedClientKey = key; // Cache the key name
-      detectionAttempted = true;
       return contextItem.client;
     }
   }
-
-  detectionAttempted = true; // Mark as attempted even if not found
   return undefined;
 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
let cachedClientKey: string | null = null;
let detectionAttempted = false;
function findMLClient(context: RequestHandlerContext) {
// Use cached result if available
if (detectionAttempted) {
if (cachedClientKey) {
const contextItem = (context as any)[cachedClientKey];
return contextItem?.client;
}
return undefined;
}
// First-time detection - cache the result
for (const key of Object.keys(context)) {
const contextItem = (context as any)[key];
if (contextItem?.client?.request && typeof contextItem.client.request === 'function') {
cachedClientKey = key; // Cache the key name
detectionAttempted = true;
return contextItem.client;
}
}
detectionAttempted = true; // Mark as attempted even if not found
return undefined;
}
function findMLClient(context: RequestHandlerContext) {
// Detect ML client on each request - context may vary between requests
for (const key of Object.keys(context)) {
const contextItem = (context as any)[key];
if (contextItem?.client?.request && typeof contextItem.client.request === 'function') {
return contextItem.client;
}
}
return undefined;
}
🤖 Prompt for AI Agents
In src/plugins/chat/server/routes/ml_routes/generic_ml_router.ts around lines 20
to 45, the module-level variables cachedClientKey and detectionAttempted cause
stale cross-request caching and must be removed; instead, perform ML client
detection per-request or scope caching to the request context (e.g., attach the
discovered client key to the passed context object or use a WeakMap keyed by the
context parameter) so each incoming request gets its own detection state;
implement by deleting the module-level flags, making findMLClient always inspect
the provided context on each call or use a WeakMap<Context, string|null> to
store a cached key per-context and fall back to iterating Object.keys(context)
when no entry exists.

Comment on lines +142 to +151
} else {
return response.custom({
statusCode: mlResponse.status,
headers: {
'Content-Type': 'application/json',
...mlResponse.headers,
},
body: typeof mlResponse.body === 'string' ? JSON.parse(mlResponse.body) : mlResponse.body,
});
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Potential JSON parse error when handling buffered response.

If mlResponse.body is not valid JSON, JSON.parse(mlResponse.body) will throw an unhandled exception, causing a 500 response without a clear error message.

       } else {
         return response.custom({
           statusCode: mlResponse.status,
           headers: {
             'Content-Type': 'application/json',
             ...mlResponse.headers,
           },
-          body: typeof mlResponse.body === 'string' ? JSON.parse(mlResponse.body) : mlResponse.body,
+          body: typeof mlResponse.body === 'string' ? safeJsonParse(mlResponse.body) : mlResponse.body,
         });
       }

Add a helper:

function safeJsonParse(body: string): unknown {
  try {
    return JSON.parse(body);
  } catch {
    return { rawBody: body };
  }
}
🤖 Prompt for AI Agents
In src/plugins/chat/server/routes/ml_routes/generic_ml_router.ts around lines
142 to 151, the code JSON.parse(mlResponse.body) can throw if body is not valid
JSON; wrap parsing in a safe helper so parsing errors are caught and a fallback
is returned. Add a small safeJsonParse function that tries JSON.parse and on
failure returns an object containing the rawBody (or the original string) and
use that helper when mlResponse.body is a string so the route returns a stable,
informative payload instead of throwing.

Comment on lines +67 to +68
// Register context with cleanup on unmount (true = cleanup when component unmounts)
useDynamicContext(contextData, false);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix inconsistent comment.

The comment states "cleanup on unmount (true = cleanup when component unmounts)" but the code passes false. Based on the useDynamicContext implementation, passing false means the context will NOT be cleaned up when the component unmounts.

Update the comment to accurately reflect the behavior:

-  // Register context with cleanup on unmount (true = cleanup when component unmounts)
+  // Register context without cleanup on unmount (false = no cleanup when component unmounts)
   useDynamicContext(contextData, false);

Or if cleanup is intended, pass true instead:

-  // Register context with cleanup on unmount (true = cleanup when component unmounts)
-  useDynamicContext(contextData, false);
+  // Register context with cleanup on unmount
+  useDynamicContext(contextData, true);
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// Register context with cleanup on unmount (true = cleanup when component unmounts)
useDynamicContext(contextData, false);
// Register context without cleanup on unmount (false = no cleanup when component unmounts)
useDynamicContext(contextData, false);
🤖 Prompt for AI Agents
In
src/plugins/explore/public/components/ask_ai_action_item/ask_ai_action_item.tsx
around lines 67-68, the inline comment incorrectly states that passing true
triggers cleanup on unmount while the code passes false (which means no
cleanup); either update the comment to reflect that
useDynamicContext(contextData, false) disables cleanup on unmount (e.g.,
"Register context without cleanup on unmount (false = do not cleanup)") or, if
the intent was to clean up, change the call to useDynamicContext(contextData,
true) so the context is removed on unmount; make one of these two changes so the
code and comment agree.

} from './components/data_source_menu';
export { DataSourceSelectionService } from './service/data_source_selection_service';
export { getDefaultDataSourceId, getDefaultDataSourceId$ } from './components/utils';
export { getDefaultDataSourceId, getDefaultDataSourceId$, getWorkspaces } from './components/utils';
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why export new function in this PR

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The chat service needs to determine whether to use:
- Workspace-scoped data source (when user is in a specific workspace)
- Global-scoped data source (when user is in the default/global context)
Previously this func is only called inside of data_source_management

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think I can look into whether I can get it from core service since workspace also has core service for infrastructure

opensearch-changeset-bot bot added a commit to ananzh/OpenSearch-Dashboards that referenced this pull request Dec 1, 2025
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
src/core/public/chat/chat_service.ts (1)

39-51: suggestedActionsService in setup contract still captures undefined at call time.

Line 49 returns suggestedActionsService: this.suggestedActionsService which evaluates to undefined when setup() is called, before setSuggestedActionsService has been invoked. Consumers accessing it from the setup contract will always get undefined.

The fix in the start contract (line 157-159) correctly uses a getter. Apply the same pattern here:

   public setup(): ChatServiceSetup {
     return {
       setImplementation: (implementation: ChatImplementationFunctions) => {
         this.implementation = implementation;
       },

       setSuggestedActionsService: (service: { registerProvider(provider: any): void }) => {
         this.suggestedActionsService = service;
       },

-      suggestedActionsService: this.suggestedActionsService,
+      get suggestedActionsService() {
+        return chatServiceInstance.suggestedActionsService;
+      },
     };
   }

Note: You'll need to capture this reference (e.g., const chatServiceInstance = this;) before the return statement, similar to how it's done in start().

🧹 Nitpick comments (10)
src/plugins/chat/public/components/chat_window.tsx (1)

139-163: Consider extracting shared subscription logic.

The subscription handling in handleSend (lines 140-157) and handleResendMessage (lines 211-228) are nearly identical. Consider extracting this into a helper function to reduce duplication.

Also, the returned cleanup function () => subscription.unsubscribe() is not used by callers since handleSend is called without storing the result. Either remove the return or ensure callers use the cleanup when needed.

src/core/public/chat/chat_service.ts (2)

163-168: Complete BehaviorSubjects in stop() to properly signal lifecycle end.

The threadId$ and windowState$ BehaviorSubjects are not completed in stop(). While this may not cause immediate issues since the service stops with the application, completing them ensures subscribers receive proper lifecycle notifications and prevents potential memory leaks if subscribers don't explicitly unsubscribe.

   public async stop() {
     this.implementation = undefined;
     this.suggestedActionsService = undefined;
     this.windowOpenCallbacks.clear();
     this.windowCloseCallbacks.clear();
+    this.threadId$.complete();
+    this.windowState$.complete();
   }

111-132: Clarify the callback-based window control pattern.

openWindow() and closeWindow() trigger callbacks without directly updating windowState. This design delegates state management to the UI layer (which calls setWindowState). While this is intentional, consider adding a brief comment explaining this indirection to help future maintainers understand the flow.

src/core/public/chat/types.ts (2)

71-77: ToolMessage doesn't extend BaseMessage unlike other message types.

All other message types (DeveloperMessage, SystemMessage, AssistantMessage, UserMessage) extend BaseMessage, but ToolMessage redefines id, content, and role directly. While this works due to structural typing, extending BaseMessage would be more consistent and ensure ToolMessage inherits any future additions to BaseMessage (like name).

-export interface ToolMessage {
-  id: string;
-  content: string;
+export interface ToolMessage extends BaseMessage {
   role: 'tool';
+  content: string;
   toolCallId: string;
   error?: string;
 }

135-143: Consider typing the observable return value more specifically.

Using observable: any in the return types (lines 138, 154, 160) loses type safety. If the observable emits ChatEvent from ../../common/events, consider typing it as Observable<ChatEvent> or defining an appropriate event union type. This would help consumers understand the expected event stream.

   sendMessage(
     content: string,
     messages: Message[]
-  ): Promise<{ observable: any; userMessage: UserMessage }>;
+  ): Promise<{ observable: Observable<ChatEvent>; userMessage: UserMessage }>;
src/plugins/chat/public/components/chat_header_button.tsx (1)

61-79: Good defensive coding with guard and try/catch.

Adding the early return when flyoutMountPoint.current is unavailable and wrapping sidecar.open in try/catch prevents potential runtime errors. However, the catch block silently returns without logging, which could make debugging difficult.

Consider logging the error for debugging purposes:

       } catch (error) {
+        console.warn('Failed to open sidecar:', error);
         return;
       }
src/core/public/chat/chat_service.mock.ts (1)

15-48: Align mock observables and defaults with real ChatService behavior

getThreadId$ / getWindowState$ each instantiate a new BehaviorSubject, and getThreadId returns an empty string. In the real ChatService, these are shared subjects with generated thread-* IDs and a single window state stream. Tests that rely on shared state, ID format, or subscription behavior might see discrepancies when swapping between real and mock services.

Consider:

  • Reusing a single BehaviorSubject instance per mock for thread ID and window state, and
  • Initializing the thread ID with a thread-${timestamp}-${random} pattern similar to the core service,

so the mock more faithfully mirrors production behavior.

src/plugins/chat/public/plugin.ts (1)

50-82: Guard against writing paddingSize: undefined into window state

setupChatbotWindowState subscribes to overlays.sidecar.getSidecarConfig$() and forwards paddingSize directly to this.chatService.setWindowState({ paddingSize }). When paddingSize is undefined, this overwrites the core window state with an undefined value, relying on later readers to fall back to 400.

To avoid muddying the core state, consider only updating when a concrete value is present:

.subscribe((paddingSize) => {
  if (paddingSize != null) {
    this.chatService?.setWindowState({ paddingSize });
  }
});

This keeps the core window state canonical while still reacting to valid sidecar padding updates.

src/plugins/chat/public/services/chat_service.test.ts (1)

243-347: Consider stubbing console.warn around tests that expect no uiSettings

These tests intentionally construct ChatService without uiSettings and assert that runAgent is called with a dataSourceId of undefined. The implementation logs a console.warn in that case via getWorkspaceAwareDataSourceId, so these specs will emit warnings in CI even though the behavior is expected.

You might want to stub console.warn in the relevant suites (or in a shared Jest setup) to keep test output clean while still validating the same behavior.

Also applies to: 350-394

src/plugins/chat/public/services/chat_service.ts (1)

67-79: Centralize coreChatService null-checking for clarity

Most public methods (getThreadId, getThreadId$, window state accessors, window event hooks, openWindow/closeWindow, newThread, persistence via getThreadId) begin with the same guard:

if (!this.coreChatService) {
  throw new Error('Core chat service not available');
}

Given that ChatService is only intended to be used with a valid ChatServiceStart (as in the plugin), you could:

  • Enforce a non-optional constructor parameter for coreChatService, or
  • Introduce a small helper like private getCore(): ChatServiceStart to perform the check once.

This removes repetition and makes the invariant (“core chat must exist”) explicit at the type or helper level.

Also applies to: 102-115, 117-139, 141-170, 172-184, 195-207, 435-447, 497-503

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 649cb3d and 57979c7.

📒 Files selected for processing (16)
  • src/core/public/chat/chat_service.mock.ts (1 hunks)
  • src/core/public/chat/chat_service.test.ts (1 hunks)
  • src/core/public/chat/chat_service.ts (1 hunks)
  • src/core/public/chat/types.ts (1 hunks)
  • src/plugins/chat/public/components/chat_header_button.tsx (5 hunks)
  • src/plugins/chat/public/components/chat_window.tsx (5 hunks)
  • src/plugins/chat/public/components/graph_visualization/error_boundary.tsx (0 hunks)
  • src/plugins/chat/public/components/graph_visualization/error_display.tsx (0 hunks)
  • src/plugins/chat/public/components/graph_visualization/error_handler.ts (0 hunks)
  • src/plugins/chat/public/components/graph_visualization/validation.ts (0 hunks)
  • src/plugins/chat/public/plugin.test.ts (4 hunks)
  • src/plugins/chat/public/plugin.ts (5 hunks)
  • src/plugins/chat/public/services/chat_context_manager.test.ts (0 hunks)
  • src/plugins/chat/public/services/chat_context_manager.ts (0 hunks)
  • src/plugins/chat/public/services/chat_service.test.ts (16 hunks)
  • src/plugins/chat/public/services/chat_service.ts (15 hunks)
💤 Files with no reviewable changes (6)
  • src/plugins/chat/public/components/graph_visualization/validation.ts
  • src/plugins/chat/public/services/chat_context_manager.ts
  • src/plugins/chat/public/components/graph_visualization/error_handler.ts
  • src/plugins/chat/public/components/graph_visualization/error_boundary.tsx
  • src/plugins/chat/public/services/chat_context_manager.test.ts
  • src/plugins/chat/public/components/graph_visualization/error_display.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/core/public/chat/chat_service.test.ts
🧰 Additional context used
🧬 Code graph analysis (7)
src/plugins/chat/public/components/chat_header_button.tsx (1)
src/core/public/index.ts (1)
  • SIDECAR_DOCKED_MODE (229-229)
src/core/public/chat/chat_service.mock.ts (1)
src/core/public/chat/types.ts (2)
  • ChatServiceSetup (170-190)
  • ChatServiceStart (195-203)
src/plugins/chat/public/components/chat_window.tsx (2)
src/core/public/chat/types.ts (1)
  • Message (82-87)
src/plugins/chat/common/types.ts (1)
  • Message (12-12)
src/plugins/chat/public/plugin.ts (4)
src/core/public/index.ts (2)
  • CoreSetup (262-298)
  • CoreStart (321-358)
src/core/public/chat/chat_service.ts (1)
  • ChatService (19-169)
src/plugins/chat/public/services/chat_service.ts (1)
  • ChatService (36-510)
src/core/public/chat/index.ts (1)
  • ChatService (23-23)
src/plugins/chat/public/plugin.test.ts (2)
src/core/public/chat/chat_service.ts (1)
  • ChatService (19-169)
src/plugins/chat/public/plugin.ts (1)
  • ChatPlugin (41-192)
src/core/public/chat/chat_service.ts (1)
src/core/public/chat/types.ts (5)
  • ChatServiceSetup (170-190)
  • ChatServiceStart (195-203)
  • ChatImplementationFunctions (149-165)
  • ChatWindowState (97-101)
  • Message (82-87)
src/plugins/chat/public/services/chat_service.test.ts (2)
src/core/public/chat/chat_service.ts (1)
  • ChatService (19-169)
src/core/public/chat/types.ts (1)
  • ChatServiceStart (195-203)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (68)
  • GitHub Check: bundle-analyzer
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Windows (ciGroup1)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup7)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup4)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup2)
  • GitHub Check: Run functional tests on Linux (ciGroup1)
  • GitHub Check: Build min release artifacts on Linux ARM64
  • GitHub Check: Build min release artifacts on Windows x64
  • GitHub Check: Build min release artifacts on macOS x64
  • GitHub Check: Build min release artifacts on macOS ARM64
  • GitHub Check: Build and Verify on Windows (ciGroup3)
  • GitHub Check: Build min release artifacts on Linux x64
  • GitHub Check: Build and Verify on Windows (ciGroup2)
  • GitHub Check: Build and Verify on Windows (ciGroup4)
  • GitHub Check: Build and Verify on Linux (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup1)
  • GitHub Check: Build and Verify on Linux (ciGroup2)
  • GitHub Check: Run plugin functional tests on Linux
  • GitHub Check: Build and Verify on Linux (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup1)
  • GitHub Check: Run plugin functional tests on Windows
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup9)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup10Fast)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup1)
  • GitHub Check: Run cypress tests (osd:ciGroup10Slow)
  • GitHub Check: Run cypress tests (osd:ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup7)
  • GitHub Check: Run cypress tests (osd:ciGroup6)
  • GitHub Check: Run cypress tests (osd:ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup2)
  • GitHub Check: Run cypress tests (osd:ciGroup3)
  • GitHub Check: Run cypress tests (osd:ciGroup4)
  • GitHub Check: Lint and validate
  • GitHub Check: lighthouse
  • GitHub Check: WhiteSource Security Check
🔇 Additional comments (8)
src/plugins/chat/public/components/chat_window.tsx (2)

67-83: Good use of ref pattern to stabilize timeline access in memoized callback.

The timelineRef pattern correctly avoids stale closure issues by providing access to the latest timeline value inside the memoized eventHandler without forcing re-creation on every timeline change.


31-34: LGTM!

The ChatWindowInstance interface correctly exposes sendMessage alongside startNewChat, enabling external callers to programmatically send messages through the chat window ref.

src/core/public/chat/types.ts (1)

1-93: Well-structured message type system.

The discriminated union pattern for Message types with role-based discrimination is a solid design. The Role type correctly enumerates all valid roles. This provides good type safety for message handling throughout the chat system.

src/plugins/chat/public/components/chat_header_button.tsx (2)

153-170: LGTM!

Using chatService.isWindowOpen() instead of the local isOpen state in the window open/close request handlers ensures consistency with the authoritative state source. The dependency array correctly reflects the actual dependencies used in the callbacks.


193-198: LGTM!

The availability check using core.chat.isAvailable() correctly gates the entire chat UI when the chat service is unavailable, aligning with the core-driven enablement model described in the PR objectives.

src/plugins/chat/public/plugin.test.ts (3)

41-45: LGTM!

Adding the capabilities mock with agenticFeaturesEnabled: true properly enables the chat feature in tests, aligning with the unified enablement model where the core service drives feature availability decisions.


93-95: LGTM!

The updated assertion correctly verifies that ChatService is constructed with uiSettings and chat from the core start contract, aligning with the new constructor signature that injects core dependencies.


180-189: LGTM!

The test correctly verifies that ChatService is always initialized regardless of configuration, with the core service handling enablement decisions. Removing the unused index parameter is a good cleanup.

Comment on lines 258 to 294
/**
* Get workspace-aware data source ID
* Determines the correct data source based on current workspace context
*/
private async getWorkspaceAwareDataSourceId(): Promise<string | undefined> {
try {
if (!this.uiSettings) {
// eslint-disable-next-line no-console
console.warn('UI Settings not available, using default data source');
return undefined;
}

// Get workspace context
const workspaces = getWorkspaces();
if (!workspaces) {
// eslint-disable-next-line no-console
console.warn('Workspaces service not available, using global scope');
return undefined;
}

const currentWorkspaceId = workspaces.currentWorkspaceId$.getValue();

// Determine scope based on workspace context
const scope: UiSettingScope = !!currentWorkspaceId
? UiSettingScope.WORKSPACE
: UiSettingScope.GLOBAL;

// Get default data source with proper scope
const dataSourceId = await getDefaultDataSourceId(this.uiSettings, scope);

return dataSourceId || undefined;
} catch (error) {
// eslint-disable-next-line no-console
console.warn('Failed to determine workspace-aware data source, proceeding without:', error);
return undefined; // Graceful fallback - undefined means local cluster
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

getWorkspaceAwareDataSourceId skips global default when workspaces are unavailable

In the !workspaces branch you log:

console.warn('Workspaces service not available, using global scope');
return undefined;

However, returning undefined bypasses getDefaultDataSourceId entirely, so in non-workspace environments you effectively ignore any configured global default data source and always fall back to the local cluster. That’s different from the workspace-enabled path, where the global default is honored via UiSettingScope.GLOBAL.

To keep behavior consistent (and match the log message), consider:

const workspaces = getWorkspaces();
if (!workspaces) {
  // eslint-disable-next-line no-console
  console.warn('Workspaces service not available, using global scope');
  const dataSourceId = await getDefaultDataSourceId(this.uiSettings, UiSettingScope.GLOBAL);
  return dataSourceId || undefined;
}

This way, workspace-less deployments still respect the configured global default data source.

🤖 Prompt for AI Agents
In src/plugins/chat/public/services/chat_service.ts around lines 258 to 294, the
branch handling !workspaces returns undefined which skips calling
getDefaultDataSourceId and therefore ignores any configured GLOBAL default;
instead, call getDefaultDataSourceId(this.uiSettings, UiSettingScope.GLOBAL) in
that branch, return its result (or undefined if falsy), and keep the
console.warn message so non-workspace deployments still honor the global default
data source.

opensearch-changeset-bot bot added a commit to ananzh/OpenSearch-Dashboards that referenced this pull request Dec 1, 2025
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
src/plugins/explore/public/components/ask_ai_action_item/ask_ai_action_item.test.tsx (2)

9-47: Consider reusing the core chat service start mock instead of hand‑rolled jest.Mocked<ChatServiceStart>

The manual mockChatService shape looks consistent with the current ChatServiceStart surface, but it will need to be kept in sync as the core chat API evolves. Since this PR adds a dedicated core chat mock module (src/core/public/chat/chat_service.mock.ts), it would be more maintainable to construct the mock from that shared helper and only override the behaviors you care about in this test (e.g., sendMessageWithWindow, isWindowOpen).

This reduces duplication and the risk of missing new methods in future refactors.


172-220: Double‑check the semantics of the second argument to sendMessageWithWindow

The updated expectations now assert that sendMessageWithWindow is always called with an empty array as the second argument:

  • Line 189–192: 'What is this error?', []
  • Line 215–218: 'Follow-up question', []
  • Line 265: 'Test question', []

If that second parameter is intended to carry tool results, context payload, or other metadata in the new core chat API, enforcing [] here might be too strict and could mask missing context from AskAIActionItem. Conversely, if this component is intentionally not providing any additional payload, you might want to either:

  • keep the assertion but add a short comment clarifying that [] is the expected contract for this call site, or
  • relax the assertion to only care about the message (e.g., toHaveBeenCalledWith('What is this error?', expect.any(Array)) or expect.anything()), so tests don’t over‑couple to how the second argument is currently used.

Please confirm that [] is the correct, long‑term behavior for this component with the new ChatServiceStart signature.

Also applies to: 265-265

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 11605d7 and e77fe6f.

⛔ Files ignored due to path filters (1)
  • src/plugins/dashboard/public/application/components/dashboard_top_nav/__snapshots__/dashboard_top_nav.test.tsx.snap is excluded by !**/*.snap
📒 Files selected for processing (2)
  • src/core/public/chat/chat_service.test.ts (1 hunks)
  • src/plugins/explore/public/components/ask_ai_action_item/ask_ai_action_item.test.tsx (7 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/core/public/chat/chat_service.test.ts
🧰 Additional context used
🧬 Code graph analysis (1)
src/plugins/explore/public/components/ask_ai_action_item/ask_ai_action_item.test.tsx (2)
src/core/public/chat/types.ts (1)
  • ChatServiceStart (195-203)
src/core/public/index.ts (1)
  • ChatServiceStart (440-440)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (68)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Windows (ciGroup1)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup7)
  • GitHub Check: Run functional tests on Linux (ciGroup4)
  • GitHub Check: Run functional tests on Linux (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup2)
  • GitHub Check: Run functional tests on Linux (ciGroup1)
  • GitHub Check: Build and Verify on Linux (ciGroup3)
  • GitHub Check: Build min release artifacts on Linux ARM64
  • GitHub Check: Build and Verify on Windows (ciGroup4)
  • GitHub Check: Build min release artifacts on Windows x64
  • GitHub Check: Build min release artifacts on macOS x64
  • GitHub Check: Build min release artifacts on macOS ARM64
  • GitHub Check: Build min release artifacts on Linux x64
  • GitHub Check: Build and Verify on Windows (ciGroup2)
  • GitHub Check: Build and Verify on Windows (ciGroup3)
  • GitHub Check: Build and Verify on Windows (ciGroup1)
  • GitHub Check: Build and Verify on Linux (ciGroup4)
  • GitHub Check: Build and Verify on Linux (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup1)
  • GitHub Check: Lint and validate
  • GitHub Check: Run plugin functional tests on Linux
  • GitHub Check: Run plugin functional tests on Windows
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup10Fast)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup10Slow)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup4)
  • GitHub Check: Run cypress tests (osd:ciGroup9)
  • GitHub Check: Run cypress tests (osd:ciGroup7)
  • GitHub Check: Run cypress tests (osd:ciGroup1)
  • GitHub Check: Run cypress tests (osd:ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup3)
  • GitHub Check: Run cypress tests (osd:ciGroup2)
  • GitHub Check: Run cypress tests (osd:ciGroup6)
  • GitHub Check: lighthouse
  • GitHub Check: bundle-analyzer
  • GitHub Check: WhiteSource Security Check

opensearch-changeset-bot bot added a commit to ananzh/OpenSearch-Dashboards that referenced this pull request Dec 2, 2025
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (1)
src/plugins/chat/public/services/chat_service.ts (1)

265-301: getWorkspaceAwareDataSourceId still bypasses global default when workspaces unavailable.

This issue was flagged in a previous review. When !workspaces (lines 279-283), the code returns undefined without calling getDefaultDataSourceId with UiSettingScope.GLOBAL. This means non-workspace deployments won't respect the configured global default data source.

Consider calling getDefaultDataSourceId with global scope when workspaces are unavailable:

       const workspaces = this.workspaces;
       if (!workspaces) {
         // eslint-disable-next-line no-console
         console.warn('Workspaces service not available, using global scope');
-        return undefined;
+        const dataSourceId = await getDefaultDataSourceId(this.uiSettings, UiSettingScope.GLOBAL);
+        return dataSourceId || undefined;
       }
🧹 Nitpick comments (2)
src/plugins/chat/public/plugin.ts (1)

114-129: Consider null-safe optional chaining for this.chatService.

The code uses this.chatService.sendMessage.bind(this.chatService) after the !isEnabled early return, so this.chatService is guaranteed to be defined at this point. However, using this.chatService! would make this explicit to readers and align with usage on lines 141 and 177.

     // Register implementation functions with core chat service
     if (this.coreSetup?.chat?.setImplementation) {
       this.coreSetup.chat.setImplementation({
         // Only business logic operations
-        sendMessage: this.chatService.sendMessage.bind(this.chatService),
-        sendMessageWithWindow: this.chatService.sendMessageWithWindow.bind(this.chatService),
-        openWindow: this.chatService.openWindow.bind(this.chatService),
-        closeWindow: this.chatService.closeWindow.bind(this.chatService),
+        sendMessage: this.chatService!.sendMessage.bind(this.chatService!),
+        sendMessageWithWindow: this.chatService!.sendMessageWithWindow.bind(this.chatService!),
+        openWindow: this.chatService!.openWindow.bind(this.chatService!),
+        closeWindow: this.chatService!.closeWindow.bind(this.chatService!),
       });
     }
src/plugins/explore/public/components/ask_ai_action_item/ask_ai_action_item.test.tsx (1)

9-9: Mock now correctly targets core ChatServiceStart; consider reusing shared mock helper

The switch to importing ChatServiceStart from core/public and typing mockChatService as jest.Mocked<ChatServiceStart> with the expanded method surface (sendMessageWithWindow, window state APIs, suggestedActionsService) looks consistent with the new core chat service contract.

To reduce duplication and keep this mock in sync with future API changes, you might consider constructing it via the new core chat mock helper (e.g., from src/core/public/chat/chat_service.mock.ts) instead of hand-rolling the object here.

Also applies to: 26-26, 35-47

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between be1d7e7 and 642abcd.

⛔ Files ignored due to path filters (1)
  • src/plugins/dashboard/public/application/components/dashboard_top_nav/__snapshots__/dashboard_top_nav.test.tsx.snap is excluded by !**/*.snap
📒 Files selected for processing (5)
  • src/core/public/chat/chat_service.test.ts (1 hunks)
  • src/plugins/chat/public/plugin.test.ts (5 hunks)
  • src/plugins/chat/public/plugin.ts (5 hunks)
  • src/plugins/chat/public/services/chat_service.ts (15 hunks)
  • src/plugins/explore/public/components/ask_ai_action_item/ask_ai_action_item.test.tsx (7 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/core/public/chat/chat_service.test.ts
🧰 Additional context used
🧬 Code graph analysis (3)
src/plugins/explore/public/components/ask_ai_action_item/ask_ai_action_item.test.tsx (1)
src/core/public/chat/types.ts (1)
  • ChatServiceStart (195-203)
src/plugins/chat/public/plugin.test.ts (2)
src/core/public/chat/chat_service.ts (1)
  • ChatService (19-169)
src/plugins/chat/public/plugin.ts (1)
  • ChatPlugin (41-192)
src/plugins/chat/public/services/chat_service.ts (4)
src/core/public/index.ts (5)
  • IUiSettingsClient (399-399)
  • ChatServiceStart (440-440)
  • WorkspacesStart (421-421)
  • ChatWindowState (443-443)
  • UiSettingScope (142-142)
src/core/public/chat/types.ts (2)
  • ChatServiceStart (195-203)
  • ChatWindowState (97-101)
src/core/public/chat/index.ts (2)
  • ChatServiceStart (9-9)
  • ChatWindowState (20-20)
src/plugins/data_source_management/public/index.ts (1)
  • getDefaultDataSourceId (29-29)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (68)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run functional tests on Windows (ciGroup1)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup2)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup1)
  • GitHub Check: Run functional tests on Linux (ciGroup3)
  • GitHub Check: Build min release artifacts on Linux ARM64
  • GitHub Check: Build min release artifacts on Windows x64
  • GitHub Check: Build min release artifacts on Linux x64
  • GitHub Check: Build min release artifacts on macOS ARM64
  • GitHub Check: Build min release artifacts on macOS x64
  • GitHub Check: Run plugin functional tests on Linux
  • GitHub Check: Run plugin functional tests on Windows
  • GitHub Check: Build and Verify on Windows (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup4)
  • GitHub Check: Build and Verify on Linux (ciGroup3)
  • GitHub Check: Build and Verify on Windows (ciGroup1)
  • GitHub Check: Build and Verify on Windows (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup1)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Lint and validate
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup7)
  • GitHub Check: Run cypress tests (osd:ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup10Fast)
  • GitHub Check: Run cypress tests (osd:ciGroup9)
  • GitHub Check: Run cypress tests (osd:ciGroup10Slow)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup6)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup3)
  • GitHub Check: Run cypress tests (osd:ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup2)
  • GitHub Check: Run cypress tests (osd:ciGroup1)
  • GitHub Check: Run cypress tests (osd:ciGroup4)
  • GitHub Check: WhiteSource Security Check
  • GitHub Check: lighthouse
  • GitHub Check: bundle-analyzer
🔇 Additional comments (15)
src/plugins/chat/public/plugin.test.ts (4)

41-62: Mock setup correctly includes new core services.

The mock setup properly adds capabilities.investigation.agenticFeaturesEnabled, uiSettings, chat, and workspaces to align with the refactored ChatService constructor and enablement flow. Using empty objects for these mocks is acceptable for unit tests that only verify constructor call arguments.


96-101: Constructor expectation correctly updated.

The test now verifies that ChatService is instantiated with the three core dependencies (uiSettings, chat, workspaces) from mockCoreStart, matching the new constructor signature.


137-147: Test description accurately reflects new enablement semantics.

The updated test description "should always initialize chat service (core service handles enablement)" correctly documents that the plugin always initializes ChatService and defers enablement decisions to the core service.


195-208: Configuration handling test updated for core-driven enablement.

The loop correctly tests various configuration formats and verifies that ChatService is always instantiated with the three core dependencies, regardless of the config values. The comment on line 202 accurately explains that enablement logic is delegated to the core service.

src/plugins/chat/public/plugin.ts (3)

12-24: Imports correctly updated for core integration.

The new imports properly bring in CoreSetup, ChatWindowState from core, and isChatEnabled from the common capabilities module to support the refactored architecture.


84-91: Setup method signature updated for core integration.

The setup method now accepts CoreSetup and stores the reference for later use in start(). This follows the OpenSearch Dashboards plugin lifecycle pattern where setup captures references needed during start.


93-112: Unified enablement check with graceful fallback.

The enablement logic using isChatEnabled() centralizes the decision. Note that ChatService is always instantiated on line 106 (before the enablement check), but the return contract correctly returns chatService: undefined when disabled. This ensures internal state is consistent even when chat is disabled.

src/plugins/chat/public/services/chat_service.ts (5)

54-72: Constructor properly initializes dependencies and restores state.

The constructor correctly stores the three dependencies and conditionally restores thread ID from session storage only when coreChatService is available. This prevents errors during initialization when the core service is not provided.


148-177: Change tracking in onWindowStateChange is well-implemented.

The implementation correctly:

  1. Skips the initial state to avoid spurious callbacks
  2. Compares previous vs new state to determine what changed
  3. Only notifies when something actually changed
  4. Properly unsubscribes on cleanup

This is a clean pattern for observing state changes with change metadata.


488-502: Guard clause improvement in clearDynamicContextFromStore.

Good refactor using early return pattern instead of nested conditionals. This improves readability.


504-516: newThread correctly delegates to core service.

The method properly delegates thread creation to coreChatService, clears local messages, removes session storage, and clears dynamic context. The error thrown when coreChatService is unavailable maintains consistency with other methods.


74-86: Throwing on missing core service may cause runtime issues.

These methods throw Error('Core chat service not available') when coreChatService is undefined. While this enforces the dependency contract, callers (UI components, other services) must properly handle these exceptions. Verify that all callers either:

  1. Are only invoked when chat is enabled (and thus coreChatService is available), or
  2. Have proper try/catch error handling
src/plugins/explore/public/components/ask_ai_action_item/ask_ai_action_item.test.tsx (3)

172-194: Execution test asserts the updated sendMessageWithWindow contract correctly

The “should send message with sendMessageWithWindow” test now verifies the two-argument call (message, []), which matches the updated payload contract and gives good coverage that the component isn’t leaking any extra context through this path.


196-220: Good coverage for behavior when chat window is already open

The new “should send message regardless of chat window state” test correctly stubs isWindowOpen to true and still asserts a sendMessageWithWindow(message, []) call, guarding against regressions where an open window might inadvertently short-circuit sending.


248-267: Trim test validates outbound message normalization against the new API

The whitespace-trimming test now asserts sendMessageWithWindow('Test question', []), which both validates input normalization and confirms the component uses the new empty-payload shape consistently with other execution tests.

wanglam
wanglam previously approved these changes Dec 2, 2025
navigation: NavigationPublicPluginStart;
contextProvider: ContextProviderStart;
charts: ChartsPluginStart;
dataSourceManagement?: DataSourceManagementPluginSetup;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit: Seems we don't rely on the dataSourceManagement plugin for now, can we remove it from the dependencies and the opensearch_dashboards.json. I'm open to do this in the future PR.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes will completely clean it out

return this.windowState$.asObservable();
},

setWindowState,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shall we hide this interface? I am thinking exposing this method may give too much details of the module.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice comment. Do you think I can work this as a follow up? windowState is mainly UI related like paddingSize, open and mode. The current pattern is like direct expose, similar to other plugins.

// Core exposes setter
  core.workspaces.setClient(client)

// Plugin uses it
  this.coreStart.workspaces.setClient(myClient);

We can unify the pattern later in the follow-up?

Signed-off-by: Anan Zhuang <[email protected]>
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (1)
src/plugins/chat/public/services/chat_service.ts (1)

279-283: !workspaces branch bypasses global default data source.

The !workspaces branch (Lines 279-283) logs "using global scope" but returns undefined without calling getDefaultDataSourceId. This means non-workspace deployments ignore any configured global default data source and always fall back to the local cluster, which is inconsistent with the workspace-enabled path (Lines 285-295).

This issue was previously flagged in a past review comment.

Apply this diff to honor global defaults in non-workspace deployments:

 const workspaces = this.workspaces;
 if (!workspaces) {
   // eslint-disable-next-line no-console
   console.warn('Workspaces service not available, using global scope');
-  return undefined;
+  const dataSourceId = await getDefaultDataSourceId(this.uiSettings, UiSettingScope.GLOBAL);
+  return dataSourceId || undefined;
 }
🧹 Nitpick comments (5)
src/plugins/explore/public/components/ask_ai_action_item/ask_ai_action_item.test.tsx (2)

9-9: Prefer using the shared coreChatServiceMock instead of a hand-rolled mock

You’re manually mirroring the ChatServiceStart surface here; this will drift as the core chat API evolves and doesn’t provide realistic return values (e.g., observables from getThreadId$ / getWindowState$). Consider switching to the central mock (e.g., coreChatServiceMock.createStartContract() from src/core/public/chat/chat_service.mock.ts) and then overriding only the behaviours this test cares about (isAvailable, isWindowOpen, sendMessageWithWindow, etc.). This will keep tests aligned with the core contract and reduce future maintenance.

Also applies to: 26-47


171-195: Verify that log context is still included in the chat message flow and add/assert tests accordingly

These tests now assert that sendMessageWithWindow is called with the user question and an empty array ([]). Given this component is “Ask AI” for a log entry and the success message still says “with log context”, please double‑check that:

  • The log context (document ID, index, message, etc.) is still being forwarded somewhere in the new architecture (e.g., via the plugin service or tools), and
  • If so, that behaviour is covered by tests (either here or in a more appropriate layer), ideally by asserting the structured payload rather than just [].

If the context is intentionally no longer passed from this component, it might be worth updating the success copy and/or adding explicit tests at the new integration point to avoid a silent regression in log-aware AI responses.

Also applies to: 196-221, 248-267

src/plugins/chat/public/plugin.ts (2)

94-112: Consider deferring ChatService initialization when disabled.

The comment states "core service handles enablement," but the code still creates a ChatService instance even when !isEnabled (Line 106), only to return undefined in the start contract (Line 110). This creates an unused service instance and wastes resources.

Consider either:

  1. Moving the ChatService instantiation inside the isEnabled block if it's truly disabled
  2. Returning the chatService instance even when disabled if the core service should manage all enablement logic

The current approach is inconsistent with both patterns.


141-141: Non-null assertions are safe but fragile.

The this.chatService! assertions (Lines 141, 177) are safe because they're within the isEnabled block where chatService is guaranteed to be defined. However, this pattern is fragile—if the control flow changes, runtime errors could occur.

Consider storing chatService in a local variable after initialization to make the type narrowing explicit:

 // Always initialize chat service - core service handles enablement
 this.chatService = new ChatService(core.uiSettings, core.chat, core.workspaces);

 if (!isEnabled) {
   return {
     chatService: undefined,
   };
 }

+const chatService = this.chatService; // Type is now narrowed to non-undefined

 // Register implementation functions with core chat service
 if (this.coreSetup?.chat?.setImplementation) {
   this.coreSetup.chat.setImplementation({
     // Only business logic operations
-    sendMessage: this.chatService.sendMessage.bind(this.chatService),
+    sendMessage: chatService.sendMessage.bind(chatService),
     // ... etc
   });
 }

Also applies to: 177-177

src/plugins/chat/public/services/chat_service.ts (1)

74-86: Optional constructor parameter but required in methods.

The constructor accepts coreChatService?: ChatServiceStart as optional (Line 56), but getThreadId() and getThreadId$() throw if it's unavailable (Lines 75-77, 82-84). This creates a mismatch:

  • If the service is optional at construction, methods should handle its absence gracefully
  • If it's required for operation, consider making it a required constructor parameter

The current pattern will lead to runtime errors if ChatService is constructed without the core service but these methods are called.

Consider either:

  1. Making coreChatService required in the constructor
  2. Returning a default value or throwing a more specific error during construction if it's missing
  3. Handling the undefined case gracefully in these methods (e.g., returning a default threadId or a BehaviorSubject with a default value)
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a5b1043 and d08609d.

⛔ Files ignored due to path filters (1)
  • src/plugins/dashboard/public/application/components/dashboard_top_nav/__snapshots__/dashboard_top_nav.test.tsx.snap is excluded by !**/*.snap
📒 Files selected for processing (6)
  • src/core/public/chat/chat_service.test.ts (1 hunks)
  • src/plugins/chat/opensearch_dashboards.json (1 hunks)
  • src/plugins/chat/public/plugin.test.ts (5 hunks)
  • src/plugins/chat/public/plugin.ts (5 hunks)
  • src/plugins/chat/public/services/chat_service.ts (15 hunks)
  • src/plugins/explore/public/components/ask_ai_action_item/ask_ai_action_item.test.tsx (7 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/plugins/chat/opensearch_dashboards.json
  • src/core/public/chat/chat_service.test.ts
🧰 Additional context used
🧬 Code graph analysis (4)
src/plugins/chat/public/plugin.test.ts (2)
src/plugins/chat/public/services/chat_service.ts (1)
  • ChatService (37-517)
src/plugins/chat/public/plugin.ts (1)
  • ChatPlugin (41-192)
src/plugins/explore/public/components/ask_ai_action_item/ask_ai_action_item.test.tsx (3)
src/core/public/chat/types.ts (1)
  • ChatServiceStart (195-203)
src/core/public/chat/index.ts (1)
  • ChatServiceStart (9-9)
src/core/public/index.ts (1)
  • ChatServiceStart (440-440)
src/plugins/chat/public/plugin.ts (4)
src/core/public/index.ts (2)
  • CoreSetup (262-298)
  • CoreStart (321-358)
src/plugins/chat/public/types.ts (3)
  • ChatPluginSetup (12-14)
  • AppPluginStartDependencies (20-24)
  • ChatPluginStart (16-18)
src/plugins/chat/public/services/chat_service.ts (1)
  • ChatService (37-517)
src/core/public/chat/chat_service.ts (1)
  • ChatService (19-169)
src/plugins/chat/public/services/chat_service.ts (5)
src/core/public/index.ts (5)
  • IUiSettingsClient (399-399)
  • ChatServiceStart (440-440)
  • WorkspacesStart (421-421)
  • Message (442-442)
  • ChatWindowState (443-443)
src/core/public/chat/types.ts (3)
  • ChatServiceStart (195-203)
  • Message (82-87)
  • ChatWindowState (97-101)
src/core/public/chat/index.ts (3)
  • ChatServiceStart (9-9)
  • Message (11-11)
  • ChatWindowState (20-20)
src/plugins/chat/public/services/ag_ui_agent.ts (1)
  • AgUiAgent (22-142)
src/plugins/data_source_management/public/index.ts (1)
  • getDefaultDataSourceId (29-29)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (990)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup7)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup10Fast)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup9)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup10Slow)
  • GitHub Check: Run cypress tests (osd:ciGroup1)
  • GitHub Check: Run cypress tests (osd:ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup6)
  • GitHub Check: Run cypress tests (osd:ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup2)
  • GitHub Check: Run cypress tests (osd:ciGroup3)
  • GitHub Check: Run cypress tests (osd:ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup1)
  • GitHub Check: bundle-analyzer
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: lighthouse
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run functional tests on Linux (ciGroup7)
  • GitHub Check: Run functional tests on Linux (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup4)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup1)
  • GitHub Check: Run functional tests on Linux (ciGroup2)
  • GitHub Check: Run plugin functional tests on Windows
  • GitHub Check: Build min release artifacts on Windows x64
  • GitHub Check: Run plugin functional tests on Linux
  • GitHub Check: Build min release artifacts on macOS ARM64
  • GitHub Check: Build min release artifacts on macOS x64
  • GitHub Check: Build min release artifacts on Linux ARM64
  • GitHub Check: Build min release artifacts on Linux x64
  • GitHub Check: Build and Verify on Windows (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup1)
  • GitHub Check: Build and Verify on Windows (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup1)
  • GitHub Check: Lint and validate
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup7)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup10Fast)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup9)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup10Slow)
  • GitHub Check: Run cypress tests (osd:ciGroup1)
  • GitHub Check: Run cypress tests (osd:ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup6)
  • GitHub Check: Run cypress tests (osd:ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup2)
  • GitHub Check: Run cypress tests (osd:ciGroup3)
  • GitHub Check: Run cypress tests (osd:ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup1)
  • GitHub Check: bundle-analyzer
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: lighthouse
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run functional tests on Linux (ciGroup7)
  • GitHub Check: Run functional tests on Linux (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup4)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup1)
  • GitHub Check: Run functional tests on Linux (ciGroup2)
  • GitHub Check: Run plugin functional tests on Windows
  • GitHub Check: Build min release artifacts on Windows x64
  • GitHub Check: Run plugin functional tests on Linux
  • GitHub Check: Build min release artifacts on macOS ARM64
  • GitHub Check: Build min release artifacts on macOS x64
  • GitHub Check: Build min release artifacts on Linux ARM64
  • GitHub Check: Build min release artifacts on Linux x64
  • GitHub Check: Build and Verify on Windows (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup1)
  • GitHub Check: Build and Verify on Windows (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup1)
  • GitHub Check: Lint and validate
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup7)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup10Fast)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup9)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup10Slow)
  • GitHub Check: Run cypress tests (osd:ciGroup1)
  • GitHub Check: Run cypress tests (osd:ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup6)
  • GitHub Check: Run cypress tests (osd:ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup2)
  • GitHub Check: Run cypress tests (osd:ciGroup3)
  • GitHub Check: Run cypress tests (osd:ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup1)
  • GitHub Check: bundle-analyzer
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: lighthouse
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run functional tests on Linux (ciGroup7)
  • GitHub Check: Run functional tests on Linux (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup4)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup1)
  • GitHub Check: Run functional tests on Linux (ciGroup2)
  • GitHub Check: Run plugin functional tests on Windows
  • GitHub Check: Build min release artifacts on Windows x64
  • GitHub Check: Run plugin functional tests on Linux
  • GitHub Check: Build min release artifacts on macOS ARM64
  • GitHub Check: Build min release artifacts on macOS x64
  • GitHub Check: Build min release artifacts on Linux ARM64
  • GitHub Check: Build min release artifacts on Linux x64
  • GitHub Check: Build and Verify on Windows (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup1)
  • GitHub Check: Build and Verify on Windows (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup1)
  • GitHub Check: Lint and validate
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup7)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup10Fast)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup9)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup10Slow)
  • GitHub Check: Run cypress tests (osd:ciGroup1)
  • GitHub Check: Run cypress tests (osd:ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup6)
  • GitHub Check: Run cypress tests (osd:ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup2)
  • GitHub Check: Run cypress tests (osd:ciGroup3)
  • GitHub Check: Run cypress tests (osd:ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup1)
  • GitHub Check: bundle-analyzer
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: lighthouse
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run functional tests on Linux (ciGroup7)
  • GitHub Check: Run functional tests on Linux (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup4)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup1)
  • GitHub Check: Run functional tests on Linux (ciGroup2)
  • GitHub Check: Run plugin functional tests on Windows
  • GitHub Check: Build min release artifacts on Windows x64
  • GitHub Check: Run plugin functional tests on Linux
  • GitHub Check: Build min release artifacts on macOS ARM64
  • GitHub Check: Build min release artifacts on macOS x64
  • GitHub Check: Build min release artifacts on Linux ARM64
  • GitHub Check: Build min release artifacts on Linux x64
  • GitHub Check: Build and Verify on Windows (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup1)
  • GitHub Check: Build and Verify on Windows (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup1)
  • GitHub Check: Lint and validate
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup7)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup10Fast)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup9)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup10Slow)
  • GitHub Check: Run cypress tests (osd:ciGroup1)
  • GitHub Check: Run cypress tests (osd:ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup6)
  • GitHub Check: Run cypress tests (osd:ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup2)
  • GitHub Check: Run cypress tests (osd:ciGroup3)
  • GitHub Check: Run cypress tests (osd:ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup1)
  • GitHub Check: bundle-analyzer
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: lighthouse
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run functional tests on Linux (ciGroup7)
  • GitHub Check: Run functional tests on Linux (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup4)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup1)
  • GitHub Check: Run functional tests on Linux (ciGroup2)
  • GitHub Check: Run plugin functional tests on Windows
  • GitHub Check: Build min release artifacts on Windows x64
  • GitHub Check: Run plugin functional tests on Linux
  • GitHub Check: Build min release artifacts on macOS ARM64
  • GitHub Check: Build min release artifacts on macOS x64
  • GitHub Check: Build min release artifacts on Linux ARM64
  • GitHub Check: Build min release artifacts on Linux x64
  • GitHub Check: Build and Verify on Windows (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup1)
  • GitHub Check: Build and Verify on Windows (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup1)
  • GitHub Check: Lint and validate
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup7)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup10Fast)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup9)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup10Slow)
  • GitHub Check: Run cypress tests (osd:ciGroup1)
  • GitHub Check: Run cypress tests (osd:ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup6)
  • GitHub Check: Run cypress tests (osd:ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup2)
  • GitHub Check: Run cypress tests (osd:ciGroup3)
  • GitHub Check: Run cypress tests (osd:ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup1)
  • GitHub Check: bundle-analyzer
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: lighthouse
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run functional tests on Linux (ciGroup7)
  • GitHub Check: Run functional tests on Linux (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup4)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup1)
  • GitHub Check: Run functional tests on Linux (ciGroup2)
  • GitHub Check: Run plugin functional tests on Windows
  • GitHub Check: Build min release artifacts on Windows x64
  • GitHub Check: Run plugin functional tests on Linux
  • GitHub Check: Build min release artifacts on macOS ARM64
  • GitHub Check: Build min release artifacts on macOS x64
  • GitHub Check: Build min release artifacts on Linux ARM64
  • GitHub Check: Build min release artifacts on Linux x64
  • GitHub Check: Build and Verify on Windows (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup1)
  • GitHub Check: Build and Verify on Windows (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup1)
  • GitHub Check: Lint and validate
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup7)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup10Fast)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup9)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup10Slow)
  • GitHub Check: Run cypress tests (osd:ciGroup1)
  • GitHub Check: Run cypress tests (osd:ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup6)
  • GitHub Check: Run cypress tests (osd:ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup2)
  • GitHub Check: Run cypress tests (osd:ciGroup3)
  • GitHub Check: Run cypress tests (osd:ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup1)
  • GitHub Check: bundle-analyzer
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: lighthouse
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run functional tests on Linux (ciGroup7)
  • GitHub Check: Run functional tests on Linux (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup4)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup1)
  • GitHub Check: Run functional tests on Linux (ciGroup2)
  • GitHub Check: Run plugin functional tests on Windows
  • GitHub Check: Build min release artifacts on Windows x64
  • GitHub Check: Run plugin functional tests on Linux
  • GitHub Check: Build min release artifacts on macOS ARM64
  • GitHub Check: Build min release artifacts on macOS x64
  • GitHub Check: Build min release artifacts on Linux ARM64
  • GitHub Check: Build min release artifacts on Linux x64
  • GitHub Check: Build and Verify on Windows (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup1)
  • GitHub Check: Build and Verify on Windows (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup1)
  • GitHub Check: Lint and validate
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup7)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup10Fast)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup9)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup10Slow)
  • GitHub Check: Run cypress tests (osd:ciGroup1)
  • GitHub Check: Run cypress tests (osd:ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup6)
  • GitHub Check: Run cypress tests (osd:ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup2)
  • GitHub Check: Run cypress tests (osd:ciGroup3)
  • GitHub Check: Run cypress tests (osd:ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup1)
  • GitHub Check: bundle-analyzer
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: lighthouse
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run functional tests on Linux (ciGroup7)
  • GitHub Check: Run functional tests on Linux (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup4)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup1)
  • GitHub Check: Run functional tests on Linux (ciGroup2)
  • GitHub Check: Run plugin functional tests on Windows
  • GitHub Check: Build min release artifacts on Windows x64
  • GitHub Check: Run plugin functional tests on Linux
  • GitHub Check: Build min release artifacts on macOS ARM64
  • GitHub Check: Build min release artifacts on macOS x64
  • GitHub Check: Build min release artifacts on Linux ARM64
  • GitHub Check: Build min release artifacts on Linux x64
  • GitHub Check: Build and Verify on Windows (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup1)
  • GitHub Check: Build and Verify on Windows (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup1)
  • GitHub Check: Lint and validate
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup7)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup10Fast)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup9)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup10Slow)
  • GitHub Check: Run cypress tests (osd:ciGroup1)
  • GitHub Check: Run cypress tests (osd:ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup6)
  • GitHub Check: Run cypress tests (osd:ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup2)
  • GitHub Check: Run cypress tests (osd:ciGroup3)
  • GitHub Check: Run cypress tests (osd:ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup1)
  • GitHub Check: bundle-analyzer
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: lighthouse
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run functional tests on Linux (ciGroup7)
  • GitHub Check: Run functional tests on Linux (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup4)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup1)
  • GitHub Check: Run functional tests on Linux (ciGroup2)
  • GitHub Check: Run plugin functional tests on Windows
  • GitHub Check: Build min release artifacts on Windows x64
  • GitHub Check: Run plugin functional tests on Linux
  • GitHub Check: Build min release artifacts on macOS ARM64
  • GitHub Check: Build min release artifacts on macOS x64
  • GitHub Check: Build min release artifacts on Linux ARM64
  • GitHub Check: Build min release artifacts on Linux x64
  • GitHub Check: Build and Verify on Windows (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup1)
  • GitHub Check: Build and Verify on Windows (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup1)
  • GitHub Check: Lint and validate
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup7)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup10Fast)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup9)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup10Slow)
  • GitHub Check: Run cypress tests (osd:ciGroup1)
  • GitHub Check: Run cypress tests (osd:ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup6)
  • GitHub Check: Run cypress tests (osd:ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup2)
  • GitHub Check: Run cypress tests (osd:ciGroup3)
  • GitHub Check: Run cypress tests (osd:ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup1)
  • GitHub Check: bundle-analyzer
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: lighthouse
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run functional tests on Linux (ciGroup7)
  • GitHub Check: Run functional tests on Linux (ciGroup3)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup4)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup1)
  • GitHub Check: Run functional tests on Linux (ciGroup2)
  • GitHub Check: Run plugin functional tests on Windows
  • GitHub Check: Build min release artifacts on Windows x64
  • GitHub Check: Run plugin functional tests on Linux
  • GitHub Check: Build min release artifacts on macOS ARM64
  • GitHub Check: Build min release artifacts on macOS x64
  • GitHub Check: Build min release artifacts on Linux ARM64
  • GitHub Check: Build min release artifacts on Linux x64
  • GitHub Check: Build and Verify on Windows (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup4)
  • GitHub Check: Build and Verify on Windows (ciGroup1)
  • GitHub Check: Build and Verify on Windows (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup2)
  • GitHub Check: Build and Verify on Linux (ciGroup3)
  • GitHub Check: Build and Verify on Linux (ciGroup1)
  • GitHub Check: Lint and validate
  • GitHub Check: Run cypress tests (osd:ciGroup14)
  • GitHub Check: Run cypress tests (osd:ciGroup17Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup3)
  • GitHub Check: Run functional tests on Windows (ciGroup11)
  • GitHub Check: Run cypress tests (osd:ciGroup16Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup12Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup15)
  • GitHub Check: Run functional tests on Linux (ciGroup5)
  • GitHub Check: Run cypress tests (osd:ciGroup10Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup7)
  • GitHub Check: Run functional tests on Windows (ciGroup4)
  • GitHub Check: Run cypress tests (osd:ciGroup14Explore)
  • GitHub Check: Run functional tests on Windows (ciGroup12)
  • GitHub Check: Run functional tests on Linux (ciGroup8)
  • GitHub Check: Run cypress tests (osd:ciGroup15Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13Explore)
  • GitHub Check: Run cypress tests (osd:ciGroup13)
  • GitHub Check: Run functional tests on Linux (ciGroup9)
  • GitHub Check: Run functional tests on Windows (ciGroup5)
  • GitHub Check: Run functional tests on Windows (ciGroup8)
  • GitHub Check: Run functional tests on Windows (ciGroup9)
  • GitHub Check: Run functional tests on Linux (ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup6)
  • GitHub Check: Run functional tests on Windows (ciGroup10)
  • GitHub Check: Run functional tests on Windows (ciGroup2)
  • GitHub Check: Run functional tests on Windows (ciGroup13)
  • GitHub Check: Run functional tests on Windows (ciGroup6)
  • GitHub Check: Run functional tests on Linux (ciGroup13)
  • GitHub Check: Run cypress tests (osd:ciGroup11)
  • GitHub Check: Run functional tests on Linux (ciGroup10)
  • GitHub Check: Run functional tests on Linux (ciGroup12)
  • GitHub Check: Run cypress tests (osd:ciGroup12)

@ananzh ananzh merged commit d8b1c9c into opensearch-project:main Dec 3, 2025
83 of 85 checks passed
@ananzh ananzh added ai Changes related to AI chat, context provider and artifact v3.4.0 labels Dec 3, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai Changes related to AI chat, context provider and artifact distinguished-contributor v3.4.0

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants